2010-09-29 49 views
2

我已經結束了在我們的mysql列中的一個亂七八糟的字符編碼。修復編碼

通常我有√©的

代替é
√∂代替鄰
√≠的相反,我

等等...

相當肯定,這裏有人會知道發生了什麼事以及如何解決。

UPDATE: 基於bobince的答案,因爲我在一個文件中有這樣的數據我做以下

#!/user/bin/env python 
import codecs 
f = codecs.open('./file.csv', 'r', 'utf-8') 
f2 = codecs.open('./file-fixed.csv', 'w', 'utf-8') 
for line in f: 
    f2.write(line.encode('macroman').decode('utf-8')), 

後其

load data infile 'file-fixed.csv' 
into table list1 
fields terminated by ',' 
optionally enclosed by '"' 
ignore 1 lines; 

正確導入數據。

UPDATE2: Hammerite,只是爲了完整性這裏有所需的詳細信息...

mysql> SHOW VARIABLES LIKE 'character_set%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | latin1      | 
| character_set_connection | latin1      | 
| character_set_database | latin1      | 
| character_set_filesystem | binary      | 
| character_set_results | latin1      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 

SHOW CREATE TABLE因爲我導入到表有DEFAULT CHARSET=utf8

EDIT3:

其實用上面的設置load沒有做正確的事情(我無法比較現有的utf8字段,我的加載數據只有看起來像,就好像它加載正確;我想是因爲的錯,但配套客戶端,連接和結果字符集),所以我的設置更新爲:再次

+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8      | 
| character_set_connection | utf8      | 
| character_set_database | utf8      | 
| character_set_filesystem | binary      | 
| character_set_results | utf8      | 
| character_set_server  | utf8      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 

上傳的數據,最後我得到了數據正確加載(與現有的數據具有可比性)。

+0

它目前使用什麼編碼?數據如何被插入? – NullUserException 2010-09-29 15:48:35

+0

回聲NullUserException,請發佈'SHOW CREATE TABLE TableName'的輸出。請同時發佈'SHOW VARIABLES LIKE'character_set%''的輸出。 – Hammerite 2010-09-29 16:11:00

+0

@Hammerite,NullUserException,感謝您的輸入... – Unreason 2010-09-30 08:31:38

回答

5

您的文本已被編碼爲UTF-8,然後錯誤地重新解碼爲Mac Roman

由於MySQL不知道Mac Roman編碼,所以無法在數據庫中修復此問題。您可以編寫腳本來遍歷每個受影響的表格的每一行,並通過反轉編碼/解碼循環來修復文本。 Python是一種可能性,有一個良好的範圍編碼的:

>>> print u'é'.encode('macroman').decode('utf-8') 
é 
>>> print u'ö'.encode('macroman').decode('utf-8') 
ö 
>>> print u'í'.encode('macroman').decode('utf-8') 
í 

或者,如果沒有非ASCII內容,通過這個問題是不受影響的,你可以嘗試使用mysqladmin導出一個SQL轉儲,然後將其轉換不管是使用上面的腳本,還是如果你有一個可以做到的文本編輯器(大概是在Mac上),將腳本加載爲UTF-8,然後將其保存爲Mac Roman。最後使用mysql < dump.sql重新導入轉儲。

+0

謝謝你,先生......我會用解決方案更新這個問題;我實際上在文件中有數據 – Unreason 2010-09-30 08:08:19