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