2012-08-01 38 views
0

我們有一個MySQL表,其中的字段使用latin1_swedish_ci,但是在那裏有一些UTF-8編碼數據。UTF8編碼的文本在更改排序規則時被錯誤地更改

當我將排序規則從latin1_swedish_ci更改爲utf8_general_ci時,它會轉換ISO-8859-1的東西,但UTF-8數據被破壞,看到像......的東西。

任何想法?

編輯:我們正使用InnoDB與MySQL 5.1

回答

1

所以,你在「latin1」欄目曾在UTF-8編碼的一些數據,但不是萬能的,現在你必須在UTF一些數據雙重編碼-8?

您可以這樣做來修復雙重編碼的值:首先轉換回latin1,將字符串重新解釋爲二進制,並告訴MySQL該二進制字符串實際上是以UTF-8編碼的文本。在MySQL這可以寫成:

convert(binary convert(mycolumn using latin1) using utf8) 

現在的問題是檢測該字符串雙重編碼,這樣就可以只更新那些。這可以通過比較字符串中原始字符串的長度和新字符串的字節長度來完成。對於雙重編碼的文本,它們應該是平等的。這是你如何結束:

update mytable set mycolumn = @str where char_length(mycolumn) = 
    length(@str := convert(binary convert(mycolumn using latin1) using utf8));