2015-06-30 66 views
1

我使用PHP和MySQL保存阿拉伯數據。插入錯誤的編碼後更新MySQL數據庫中的數據

我的數據庫排序規則是:utf8_general_ci

我的數據庫字符集:utf8

起初我並沒有插入之前使數據被插入在數據庫奇怪的字符,但被正確地顯示在使用SET NAMES utf8我的應用程序。使用SET NAMES utf8後,數據已正確插入,但舊數據即使在我的應用程序中也不以阿拉伯字符顯示(新數據正常)。

如何更新我的應用程序和MySQL數據庫中所有要用阿拉伯文字母顯示的數據?

更新

當我檢查兩個字符串中使用mb_detect_encoding功能(我想轉換成插入一個和一個)的編碼,我得到兩個字符串的UTF-是8。

下面是兩個字符串的例子:

文本插入:الإسم بالعربية 我需要轉換爲文本:الإسم بالعربية

+0

見http://stackoverflow.com/questions/279170/utf-8-all-the-way 279279#279279 - 如果這還不夠,請提供一個例子,以及'SELECT col,HEX(col)FROM table WHERE ...'來查看它是否被正確存儲。 –

+0

這是行例如: COL值: 'اÙ「إسÙ...باÙ「عربÙ​​ŠØ©' HEX(COL)值:'C398C2A7C399E2809EC398C2A5C398C2B3C399E280A620C398C2A8C398C2A7C399E2809EC398C2B9C398C2B1C398C2A8C399C5A0C398C2A9' –

回答

2

您患有「雙重編碼」。

這是發生了什麼事。

  • 客戶端將字符編碼爲utf8;和
  • SET NAMES latin1謊稱聲稱客戶端有latin1編碼;和
  • 表中的列聲明CHARACTER SET utf8

讓我們來看看e-acute會發生什麼:é

  1. 十六進制爲utf8爲2字節:C3A9
  2. SET NAMES latin1認爲這2 LATIN1編碼字符é(己烷:C3A9
  3. 由於目標是CHARACTER SET utf8,需要轉換的那些2個字符。 Ã轉化爲UTF8(十六進制C383)和©(十六進制C2A9
  4. 所以,4個字節被儲存(十六進制C383C2A9

當讀回出,進行反向步驟, 和最終用戶可能注意到沒有錯。什麼是錯誤的:

  • 存儲的數據是它應該是2倍(亞洲語言的3倍)。
  • 比較等於,大於等可能無法按預期工作。
  • ORDER BY可能無法按預期工作。

像這樣的事情將修復您的數據:

UPDATE ... SET col = CONVERT(BINARY(CONVERT(
         CONVERT(UNHEX(col) USING utf8) 
         USING latin1)) USING utf8); 

More discussionMore examples of fixing it

+0

我在您發送的第二個鏈接中使用了計劃A,並且它的效果比預期的更好。謝謝! –

+1

我應該強調'SET NAMES utf8'是爲了防止未來的'INSERTs'搞亂。 –

+0

是的,我已經考慮過了。感謝 –

0

也許這是有幫助的[http://forums.mysql.com/read.php?103,209072,209072

*同樣的錯誤,並解決方案在MySQL論壇上。 (自2008年起)

+0

該解決方案是用於插入數據或用新數據更新,但我只想更改當前的數據編碼或顯示方式。 –

+0

對不起,請嘗試使用[project](http://www.ar-php.org/),bin [Arabic-3.6.0](http://sourceforge.net/projects/ar-php/files/ ) **原創[胎面](http://stackoverflow.com/questions/6175053/how-to-convert-arabic-characters-to-unicode-using-php) –

+0

謝謝,這是非常有用的,但不是在我的情況 。我更新瞭如何顯示角色的問題。 –