2013-02-13 104 views
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" /> 

有人點我在正確的方向,以什麼可能會發生,什麼做錯了。非常感激。

+0

你的'settings.php'文件是如何配置的?你有一個'$ db_url'變量,它看起來如何?當然,我們不需要證書,只是對格式感興趣。是這樣的:$ db_url ='mysqli:// username:password @ localhost/databasename';'? – Max 2013-02-15 10:41:24

+0

最大 - 是的,我的數據庫網址就像你說的:$ db_url ='mysqli:// mydbusername:mydbpassword @ localhost/mydbname'; – mackelkin 2013-02-15 11:13:13

+0

奇怪,因爲在這種情況下,Drupal函數('db_query','db_fetch_object')只是PHP中'mysqli'函數的包裝器。而這些似乎正在返回正確的結果...... – Max 2013-02-15 11:38:15

回答

0

只要確保你寫查詢的.module文件(?)使用的是utf-8?