2010-03-30 33 views
28

我將一個網站從ISO轉換爲UTF-8,因此我也需要轉換MySQL數據庫。將MySQL數據庫從拉丁文轉換爲UTF-8

在互聯網上,我讀了各種解決方案,我不知道選哪一個。

我真的需要我的VARCHAR列轉換爲二進制,然後爲UTF-8這樣的:

ALTER TABLE t MODIFY col BINARY(150); 
ALTER TABLE t MODIFY col CHAR(150) CHARACTER SET utf8; 

這需要很長的時間做,對於每列,每個表,每個數據庫的。

我有10個數據庫,每個數據庫有20個表格,大約有2-3個varchar列(每個列有2個查詢),這使我可以在的1000個查詢中編寫!怎麼做?

解決: 我後,我使用的代碼:

PASSWORD="" 
db=$1 

mysqldump --password=$PASSWORD --set-charset --skip-set-charset --add-drop-table --databases "$db" > /home/dev/backup/bdd.sql 

QUERY="ALTER DATABASE \`$db\` DEFAULT CHARACTER SET utf8;" 
mysql --password=$PASSWORD --database "$db" -e "$QUERY" 

mysql --password=$PASSWORD --default-character-set=utf8 < /home/dev/backup/bdd.sql 

見下面的答案以獲取更多信息。

+2

是不是'--set-charset'和'--skip-設置charset'直接競爭的標誌嗎? Docs表示它們會影響'SET NAMES'的使用,但不會設置每個表通過'mysqldump'輸出的'DEFAULT CHARSET = X'參數。 (mysql 5.5) – fideloper 2014-01-28 21:19:19

回答

19

你可以很容易地使用轉儲來做到這一點。請使用

mysqldump --skip-opt --set-charset --skip-set-charset 

然後創建另一個數據庫的轉儲,設置它的默認字符集設置爲UTF-8,然後用裝載轉儲回:

mysql --default-character-set=<your iso encoding> 

主要的想法是做一個轉儲沒有任何數據編碼的標誌。
因此,在創建時,表的編碼將從數據庫編碼繼承並設置爲UTF-8。與--default-character-set我們告訴MySQL自動重新編碼我們的數據。

+0

哦,這看起來不錯!爲什麼不在文檔上,或者沒有人在那裏談論這個問題,謝謝我將測試它 – 2010-03-30 09:31:06

+0

@Matthieu,因爲它似乎你會用'--all-databases'完成它,請注意事項。首先在一個數據庫上進行備份和測試整個算法。 – 2010-03-30 09:50:28

+0

嗯,我剛剛測試(只在一個數據庫上,可以肯定),這並不會改變列的編碼(它們仍然是「拉丁」)。可以肯定的是,對於mysqldump,3個參數不需要值? – 2010-03-30 09:56:20

6

我用mysqldump版10.11 DISTRIB 5.0.77

出於某種原因,創建選項引擎和AUTO_INCREMENT省略。這導致了很多插入錯誤,因爲auto_increment在主鍵字段上消失了。

這對我有效。我使用--opt和使用sed從sql文件中刪除charset。

mysqldump -p --opt --skip-set-charset --add-drop-table dbname > /tmp/dbname.sql 
sed -i 's/DEFAULT CHARSET=latin1//g' /tmp/dbname.sql 
ALTER DATABASE dbname DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_danish_ci; 
mysql -p --default-character-set=utf8 db < /tmp/dbname.sql 
+1

由於Mysql 5.5會輸出'DEFAULT CHARSET = latin1',其中'--default-character-set = utf8'在導入時不會覆蓋,因此這一步變得必要。我使用了'sed -i'/ DEFAULT CHARSET = latin1/DEFAULT CHARSET = utf8/g'/ tmp/dbname.sql'明確地將其設置爲utf8。 – fideloper 2014-01-28 21:25:50

1
mysqldump --opt --skip-set-charset --default-character-set='latin1' -u root -p revive_adserver --result-file='dump.sql' 

vim dump.sql 

:%s/latin1/utf8/gi 

:wq 

mysql -u root -p 

ALTER DATABASE revive_adserver CHARACTER SET utf8; 

\q 

mysql -D revive_adserver -u root -p < dump.sql