2012-04-19 61 views
2

我最初與latin1編碼和latin1_swedish_ci排序規則創建了一個龐大的數據庫。MySQL的字符編碼

我做了很多改變,現在我使用Doctrine2,該查詢之前使用SET NAMES UTF8。我之前使用的是Yii框架,它也被設置爲使用UTF-8。基本上我在開始時忽略了所有這些,但從我的理解來看,我一直在向數據庫寫入UTF-8數據,儘管它們都被認爲是latin1。

我想我的數據庫轉換爲UTF-8,但不知道如何安全地做到這一點,並確保我不會丟失數據。

兩個問題:

  1. 有沒有一種方法,以確保我已經正確地做到了這一點?我有2 GB的數據,所以我不能通過掃描來測試,但是我可以查找某些字符以確定數據庫是否已經使用UTF-8?

  2. 什麼是一切轉換的正確方法?我見過一些人說我必須mysqldump並重新導入(使用某些標誌,http://blog.makezine.com/2007/05/08/mysql-database-migration-latin/http://docs.moodle.org/22/en/Converting_your_MySQL_database_to_UTF8)。其他人說你可以每列ALTER TABLE...(http://www.bothernomore.com/2008/12/16/character-encoding-hell/)。我已經看到一些命令,如SET utf8作爲ALTER TABLE的一部分,但我不知道它是否有效。

編輯:

我甩了數據,並發現了幾個重音符號。這是否表明數據本身是UTF-8?如果是這樣,我htink這裏的說明適用,因爲我可以「轉換」成團塊,並安全返回地面http://codex.wordpress.org/Converting_Database_Character_Sets

再次編輯:

做什麼,我在以前的鏈接閱讀後,我發現比較數據,我在第一個非ascii(?)之後錯過了所有字符。所以我用捲曲的單引號設置了標題,新數據庫中包含該字符以及缺失後的所有字符。作爲一個例子,這裏是我正在運行的代碼:

ALTER TABLE articles CHANGE title title VARBINARY(255) NOT NULL; 
ALTER TABLE articles CHANGE title title VARCHAR(255) CHARACTER SET utf8 NOT NULL; 

不知何故,這導致我失去了數據。

但是如果我傾倒,每個表的字符集latin1和utf8的改變,它的工作原理。我寧願只是修改一些東西,而不是轉儲和重新創建,但如果沒有人有任何其他建議或想法基於此,我會採用它。

+0

我有類似的問題。我使用HeidiSQL的批量維護功能。 – hjpotter92 2012-04-19 05:13:10

回答

1

我得到它與轉儲和重新進口工作。我遵循這個指南主要是:http://en.gentoo-wiki.com/wiki/Convert_latin1_to_UTF-8_in_MySQL

如果任何人在我的情況(你有UTF-8存儲在latin1的數據庫中的數據,你一直通過調用SET NAMES utf8訪問,那麼這裏就是你可以試試(我的修改從什麼上述源極)。

mysqldump -h example.org --user=foo -p -c --insert-ignore --skip-set-charset -r dump.sql dbname 

仔細檢查,這是UTF-8(我的是)

file dump.sql 

請在轉儲轉換

perl -pi -w -e 's/CHARSET=latin1/CHARSET=utf8/g;' dump.sql 

創建一個新的數據庫(我沒有刪除舊以防萬一)

mysql --user=foo -p --execute="CREATE DATABASE dbnameutf8 CHARACTER SET utf8 COLLATE utf8_general_ci;" 

進口

mysql --user=foo -p --default-character-set=utf8 dbnameutf8 < dump.sql 

希望可以幫助別人。請記住,ALTER TABLE...的東西可能不起作用(它並沒有在我的情況下)。

2

要檢查的東西,你可以這樣做:

SELECT t1.* 
FROM table_1 t1 
JOIN table_1 t2 on t1.guid = t2.guid AND 
t1.field_1 <> t2.field_1 COLLATE UTF-8 

基本上,在飛行中,更改列的排序規則,看看是否有將是什麼,是要出問題。

你絕對不需要重新導入的一切,ALTER TABLE新的編碼應該罰款,承擔一切都將轉換確定。

+0

我必須「改變表格」並單獨更改所有字符串列嗎?這似乎是我正在閱讀 – Matt 2012-04-19 05:21:45

+0

而這不起作用「U known collat​​ion:'UTF'」給出。 – Matt 2012-04-19 05:24:58

+0

另外,試過:'mysql> SELECT t1。* FROM articles t1 JOIN articles t2 ON t1.id = t2.id AND t1.title <> t2.title COLLA TE utf8_general_ci LIMIT 10; 錯誤1253(42000):COLLATION'utf8_general_ci'對CHARACTER SET'latin1''無效 – Matt 2012-04-19 05:27:25