我正在工作的网站是波斯语的,所有文本都显示为?????(问号)。我将DB表的排序规则更改为UTF8_general_ci,但它仍然显示???
我运行了下面的脚本来更改所有的表,但这并不能很好地工作。
我想知道我做错了什么
<?php
// your connection
mysql_connect("mysql.ord1-1.websitesettings.com","user_name","pass");
mysql_select_db("895923_masihiat");
// convert code
$res = mysql_query("SHOW TABLES");
while ($row = mysql_fetch_array($res))
{
foreach ($row as $key => $table)
{
mysql_query("ALTER TABLE " . $table . " CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci");
echo $key . " => " . $table . " CONVERTED<br />";
}
}
?>
坏消息。但首先,仔细检查:
SELECT col, HEX(col)...
看看表里有什么。如果十六进制显示3F
,则数据不存在。正确存储的dal
字符应为十六进制D8AF
;hah
是十六进制D8AD
。
发生了什么:
- 您有utf8编码的数据(良好)
SET NAMES latin1
有效(默认,但错误)- 该列已声明为
CHARACTER SET latin1
(默认值,但错误)
当您INSERTed
数据时,它被转换为latin1,latin1没有波斯语字符的值,因此问号取代了它们。
治愈方法(针对未来的INSERTs):
- 使用mysqli_*接口而不是不推荐使用的mysql_*接口重新编写应用程序
- utf8编码数据(良好)
- mysqli_set_charset('utf8')
- 检查列和/或表的默认值是否为
CHARACTER SET utf8
- 如果您在网页上显示,
<meta...utf8>
应该在顶部附近
上面的讨论是关于字符编码CHARACTER SET
的。现在来看一个关于COLLATION
的提示,它用于比较和排序。
如果您希望这些被平等对待:"بيدمد"="ب",则对COLLATION
使用utf8_unicode_ci(而不是utf8_general_ci)。