0
我有一個關於檢索UTF8字符集中的字符的drupal 6非常奇怪的問題。有趣的是,似乎只有drupal API纔會正確檢索數據;當我直接使用mysqli和命令行獲取數據時,一切似乎都沒有問題。Drupal 6 db_query問題檢索utf8字符
數據庫和表設置爲正確的字符集和校對規則,如下圖所示:
mysql> show variables like "collation_%";
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
mysql> show variables like "char_%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
當我檢索命令行的數據,似乎一切都OK。
mysql> select id, name from web_gfo_article_type;
| 294 | ДОСЛОВНО |
| 295 | EXAMEN |
| 296 | REVISIÓN |
在我的自定義Drupal模塊一個正在使用Drupal的API(db_query)檢索相同的數據,並使用直接的方法,使用的mysqli。
直接的方法:
294 ДОСЛОВНО
295 EXAMEN
296 REVISIÓN
使用Drupal的DB API:
$r = db_query("select id, name from web_gfo_article_type");
while ($row = db_fetch_object($r)) {
print('<br/>' . $row->id . ' ' . $row->name);
}
Drupal的DB API調用的結果:
294 Ð」ОСЛОВÐО
295 EXAMEN
296 REVISIÃ「N
的直接方法
$mysqli = new mysqli("localhost", "my_db_user_name", "my_db_password", "my_db_name");
$r = $mysqli->query("select id, name from web_gfo_article_type");
while ($row = $r->fetch_object()) {
print('<br/>' . $row->id . ' ' . $row->name);
}
結果
正如您可以清楚地看到的那樣,drupal db API如何檢索數據會導致UTF數據在呈現時受到干擾而出現嚴重錯誤。所有上述結果被顯示在一個HTML頁面,其中元報頭信息已正確設置即
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
有人點我在正確的方向,以什麼可能會發生,什麼做錯了。非常感激。
你的'settings.php'文件是如何配置的?你有一個'$ db_url'變量,它看起來如何?當然,我們不需要證書,只是對格式感興趣。是這樣的:$ db_url ='mysqli:// username:password @ localhost/databasename';'? – Max 2013-02-15 10:41:24
最大 - 是的,我的數據庫網址就像你說的:$ db_url ='mysqli:// mydbusername:mydbpassword @ localhost/mydbname'; – mackelkin 2013-02-15 11:13:13
奇怪,因爲在這種情況下,Drupal函數('db_query','db_fetch_object')只是PHP中'mysqli'函數的包裝器。而這些似乎正在返回正確的結果...... – Max 2013-02-15 11:38:15