2013-10-21 48 views
3

問題摘要:在UTF8和Latin1的表ISO-8859-1的數據轉換爲UTF-8

雖然試圖用mysql數據庫網站latin1和UTF8轉換,一些特殊字符無法正確顯示,儘管確保字符集都是utf8系統。

問題詳細信息:

這是一個常見的問題。但我似乎增加了複雜性。

幾年前,一個不知情的開發者(我),把一個網站與MySQL放在一起。一些表格使用latin1_swedish_ci和utf8_general_ci進行設置。所有的輸入/顯示都是通過帶有iso-8859-1字符集的頁面完成的。

現在,我的任務是將所有這些數據轉換爲utf-8,並最終統一編碼。但是,我在兩種情況下都遇到過許多特殊字符(例如:ü)。這些字符似乎無法在UTF-8頁面上正確顯示。它們顯示爲Ins.而不是當在mysql查詢瀏覽器中查看utf8表中的數據時,正確輸入的utf8'd'u'顯示爲某些特殊字符,而拉丁文'u'顯示不正確,因爲它應該顯示在頁面上。但事實並非如此。

我已經嘗試了一些事情:

  1. Percona的腳本:https://github.com/rlowe/mysql_convert_charset
  2. 山坳轉換爲二進制,然後以UTF8
  3. UTF8轉換表,拉丁,然後重複上面的過程

似乎沒有什麼治療數據。

轉儲整個數據庫和重要的是不是一個真正可行的選擇,因爲它現在是一個巨大的數據庫,停機時間受到限制。

UPDATE(10月22日 - 2013年)

我已經採取@deceze建議和審查我的所有內容編碼領域的每http://kunststube.net/frontback/。我確實發現了一些我仍然在latin1中傳遞/編碼數據的地方。所以,我現在已經將它全部更改爲UTF-8。但是,數據在特定字段中仍然顯示不正確。在一個utf8表格中(沒有列有隱式編碼),field1在latin1中。我可以通過運行顯示正確的文字下面證實了這一點:從我的表

選擇轉換(CAST(轉換(FIELD1使用LATIN1)作爲二進制使用 UTF8))WHERE ID = 1

這會將Hahnemühle轉換爲Hahnemühle。

在字段2中,數據顯示爲不同的(未知)編碼。上面的查詢在field2上使用時,將Hahnem�hle轉換爲Hahnem hle。我已經通過http://dev.mysql.com/doc/refman/5.5/en/charset-charsets.html取代latin1的所有字符,但沒有一個似乎正確地將數據吐出。

+0

這些「問題」到底是什麼?這些字符是否正確存儲在各自的列中?當他們在一個體面的管理界面上查看他們時,他們是否應該看起來像他們應該看的,還是他們已經亂碼?除非您嘗試在Latin1列中存儲非Latin1字符,否則到目前爲止設置這些列的設置並不重要。 latin1列不能存儲多於由Latin-1定義的256個字符,只是在日常使用中無關緊要。如果您使用正確的連接編碼插入數據,則應該沒有問題。 – deceze

+0

@deceze我添加了這個問題(對不起)。這些字符在utf-8頁面上沒有正確顯示。相反,我在Google Chrome中收到一個鑽石問號。在mysql查詢瀏覽器中查看utf8表中的數據時,正確輸入的utf8'd'u'將顯示爲一些特殊字符,而不正確的latin1'u'則顯示爲它應該出現在頁面上。但事實並非如此。 – David

+0

您是否更新了連接編碼,因此來自數據庫的數據實際上是UTF-8編碼?或者你仍然在檢索Latin-1中的數據? – deceze

回答

3

設置一列到latin1和其他到utf8在MySQL中是完全正確的。這裏沒有問題需要解決。這個字符集參數僅影響數據在內部存儲的方式。這當然也意味着你不能在latin1列中存儲例如「漢字」。但假設你只是在那裏存儲「拉丁-1字符」,那很好。

MySQL有一些通常被稱爲連接編碼。它告訴MySQL你從PHP(或其他地方)發送給它的文本是什麼編碼,以及從MySQL檢索數據時你想要返回哪種編碼。列charset,「輸入連接編碼」和「輸出連接編碼」都可以是不同的東西,MySQL會根據需要隨時轉換編碼。

因此,假設您到目前爲止使用了正確的連接編碼,並且數據已正確存儲在您的數據庫中,並且您尚未嘗試在Latin-1列中存儲非拉丁文-1字符,那麼您只需執行更新您的列字符集爲UTF-8是:

ALTER TABLE table MODIFY column TEXT [...] CHARACTER SET utf8; 
4

你可以嘗試的mysqldump從ISO-8859-1轉換爲UTF-8:

mysqldump --user=username --password=password --default-character-set=latin1 --skip-set-charset dbname > dump.sql 
chgrep latin1 utf8 dump.sql (or when you prefer sed -i "" 's/latin1/utf8/g' dump.sql) 
mysql --user=username --password=password --execute="DROP DATABASE dbname; CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;" 
mysql --user=username --password=password --default-character-set=utf8 dbname < dump.sql 
+0

爲sed tidbit +1,另一種chgrep方式爲獎勵。 – stefgosselin

1

您可以擺脫「字形「字符( )通過將UTF8_encode應用於字符串,然後將其顯示在頁面中。