2015-04-22 40 views
1

我正在使用的网站是在波斯语,所有文本都显示为????? (问号)。 我将我的数据库表格整理为UTF8_general_ci,但仍显示???存储非英文字符,得到'?????' - MySQL字符集问题

我跑了下面的脚本来改变所有的表,但是这并没有工作。

我想知道我做错了

<?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 />"; 
    } 
} 
?> 
+0

如果你想知道你做错了什么:阅读[绝对最小每个软件开发人员,肯定必须知道Unicode和字符集(没有借口!)](http://www.joelonsoftware.com/文章/ Unicode.html)。然后意识到有很多事情要做:数据库整理,表格整理,数据库连接字符集('mysqli_set_charset($ con,“utf8”);'),网页字符集(meta-tags和/或http头文件)源文件编码等。**每个**都需要正确才能正常工作。 – RobIII

回答

0

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

SELECT col, HEX(col)... 

看看表中有什么。如果十六进制显示3F,那么数据不见了。正确存储,dal字符应该是十六进制D8AF; hah是十六进制D8AD

发生了什么事:

  • 你有UTF8编码的数据(好)
  • SET NAMES latin1已生效(默认,但错)
  • 列被宣布CHARACTER SET latin1(默认,但错)

由于您的INSERTed数据,它被转换为latin1,它没有波斯语字符的值,因此问号将其替换。

的固化(在未来`插入):

  • 使用mysqli_ *接口,而不是过时的mysql_ *界面重新编码您的应用程序。
  • UTF8编码的数据(好)
  • mysqli_set_charset( 'utf-8')
  • 检查柱子(S)和/或表默认为CHARACTER SET utf8
  • 如果您在网页上显示,<meta...utf8>应靠近顶部。

以上讨论的是关于字符编码的CHARACTER SET。现在在COLLATION,这是用于比较和排序的小费。

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

+0

@RobIII - 良好的链接。这似乎涵盖了一个失败案例。我在[我的博客](http://mysql.rjweb.org/doc.php/charcoll)中发现了4个案例,并且有方法修复其中两个案例。 JFA的案例是数据丢失的两个案例之一。 –