2013-02-13 39 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?