2016-02-12 115 views
0

我想將我的數據庫轉換爲存儲unicode符號。我可以將MySQL數據庫字符集從latin1轉換爲utf8而不丟失數據嗎?

目前的表有:

latin_swedish_ci整理和latin1字符集

OR

utf8_general_ci整理和utf8字符集

我不知道現有的數據是如何編碼的,但我想這是utf-8編碼,因爲我使用Django,我覺得發送到數據庫之前編碼在utf-8數據。

我的問題是: 我可以將錶轉換爲utf8_unicode_ci整理和使用下面的查詢不會弄亂現有的數據集utf-8性格嗎? (如sugested在this後)

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

考慮latin1的是UTF-8的子集,我覺得它要高度重視的工作。你們有什麼感想?

預先感謝您。

P.S:MySQL版本是:5.1

回答

0

Latin1的不是UTF-8的一個子集 - ASCII是。然而,Latin1以Unicode表示。

CONVERT TO應該工作,只要數據存儲在正確的編碼首先。 Django可能在數據庫連接上使用了UTF-8,但數據庫應該在運行時重新編碼。

檢查使用的實際編碼 - 使用mysql命令行工具來執行SQL查詢,該查詢選擇您知道包含非ASCII字符的行。然後使用mysql HEX()函數檢查使用的字節。如果你看到比>0x7f更大的字節,檢查它們不符合有效字符在https://en.wikipedia.org/wiki/ISO/IEC_8859-1#Codepage_layout

+0

last_name ='RÖNSCH' HEX(substring(last_name,2,1))返回'c396' 這是什麼意思? –

+0

'選擇從十六進制(姓氏)...' –

+0

雖然從Django文檔: 「所有Django的後端數據庫的自動轉換Unicode字符串到相應的編碼談話的數據庫,還自動轉換從數據庫中檢索字符串。到Python的Unicode字符串,甚至不需要告訴Django什麼編碼你的數據庫使用:這是透明處理的。「 –

0

如果你有c396坐在latin1列,你想它的意思Ö,那麼你是半路「雙重編碼「。做不是使用CONVERT TO;這將真正讓你進入「雙重編碼」。您需要2-step ALTER

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...; 
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...; 

如果你已經搞砸了進一步的,現在Ö是十六進制C383E28093,那麼你需要fix double encoding

這讓你在2步LATIN1字節:

CONVERT(CONVERT(UNHEX('C383E28093') USING utf8) USING latin1) --> 'Ö' (C396) 
HEX(CONVERT(CONVERT(UNHEX('C396') USING utf8) USING latin1)) --> 'Ö' in latin1 (D6) 

這讓你2個字節的UTF8編碼:

CONVERT(BINARY(CONVERT(CONVERT(UNHEX('C383E28093') USING utf8) USING latin1)) USING utf8) 

是否要被處理latin1列?或者utf8?

+0

我希望所有的表都是utf-8編碼的。我有'c396'坐在'latin1'欄裏,意思是'Ö'。然後我用 'ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;' (沒有錯誤或由'MySQL'顯示的警告)。 現在,當我在值爲'Ö'的行上使用HEX()時,它會再次返回'c396'。 –

+0

這意味着我沒有做「雙重編碼」,儘管我已經運行了「CONVERT TO」。此外,我現在可以在此表中存儲unicode符號。看來我做對了。或沒有? –

+0

我不知道你做了什麼,但我試了一下,得到了十六進制'C383E28093' - 雙重編碼。請讓我看看SHOW CREATE TABLE。 –

相關問題