2015-04-22 70 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的案例是數據丟失的兩個案例之一。 –