存储非英文字符,得到'?????' - MySQL字符集问题

时间:2015-04-22 17:36:02

标签: php mysql utf-8 character-encoding

我正在处理的网站是波斯语,所有文字都显示为????? (问号)。 我将我的数据库表的排序规则更改为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 . " =&gt; " . $table . " CONVERTED<br />";
    }
}
?>

1 个答案:

答案 0 :(得分:0)

坏消息。但首先,仔细检查:

SELECT col, HEX(col)...

查看表格中的内容。如果十六进制显示3F,则数据消失。正确存储,dal字符应为十六进制D8AF; hah为十六进制D8AD

发生了什么:

  • 你有utf8编码的数据(好)
  • SET NAMES latin1生效(默认,但错误)
  • 该列已声明CHARACTER SET latin1(默认,但错误)

当你INSERTed数据时,它被转换为latin1,它没有波斯语字符的值,所以问号替换了它们。

治愈(对于未来的“INSERT”):

  • 使用mysqli_ *接口而不是弃用的mysql_ *接口重新编写应用程序。
  • utf8编码数据(好)
  • mysqli_set_charset( 'UTF8')
  • 检查列和/或表默认为CHARACTER SET utf8
  • 如果您在网页上展示,<meta...utf8>应该在顶部附近。

上面的讨论是关于字符编码的CHARACTER SET。现在提供COLLATION上的提示,用于比较和排序。

如果你希望这些被视为相同:'بسم'='بسم',那么对COLLATION使用utf8_unicode_ci(而不是utf8_general_ci)。