奇怪的MySQL编码问题

时间:2011-01-25 10:06:40

标签: php mysql encoding utf-8 arabic

我在页面表中有一个包含阿拉伯数据的列。

如果我这样做......

@mysql_query( "select title from pages where web_id = '$id'" );

我在阿拉伯语中获得了正确的数据。

但是如果我再次调用相同的函数,实际上它是在一个循环中,第二次它给我带来了垃圾数据。看起来像这样

"تنظيم الأوقا٠العامة اقرأ قطاع

此外,如果在该查询之前,我执行以下任一操作:

@mysql_query("SET NAMES 'utf8'");
@mysql_set_charset( 'utf8' );
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'" );

即使是第一次通话,我也总是得到垃圾数据。这里发生了什么?

请注意,数据库,表和字段排序规则设置为utf8_bin

2 个答案:

答案 0 :(得分:1)

一些随机提示:

尽量不要使用@运算符。它将禁止任何错误消息。

您需要正确转义输入参数:

mysql_query("SELECT title FROM pages WHERE web_id = '" . mysql_real_escape_string($id) . "'");

您需要检查mysql_query()的返回值:

$res = mysql_query("SELECT title FROM pages WHERE web_id = '" . mysql_real_escape_string($id) . "'");
if(!$res){
    die('Could not fetch page title'); // See mysql_error() for error message
}

确保您的PHP源代码保存为UTF-8。任何体面的编辑器都允许您保存为UTF-8,并在状态栏中显示当前编码。

检查您的表格定义。 MySQL允许设置每个表和列编码。

使用mysql_set_charset()设置连接编码。

确保浏览器将您的网页呈现为UTF-8。在PHP中,您可以使用以下命令生成相应的HTTP标头:

header('Content-Type: text/html; charset=utf-8');

答案 1 :(得分:0)

您应该验证您的字段是否实际包含UTF-8数据。即使将其设置为UTF-8,您也可能导入数据不正确或数据可能已损坏。您可以使用以下命令查看特定的字节流:

SELECT hex(myfield) FROM mytable;

如果您已导入数据,则应注意数据文件可能已被解释为采用不同的编码 - 实际上甚至可能已经这样做了。您需要确保正确识别文件,例如:

mysql --default-character-set=utf8 database < mydbbackup.sql