2017-02-24 39 views
2

我有一個MySQL數據庫(myDB;大小~2GB),有4個表格(tab1tab2,tab3,tab4)。目前,使用字符集ISO-8859-1(即Latin-1)添加存儲在表中的數據。如何將MySQL數據庫從Latin-1遷移到UTF-8?

我想轉換所有表中的數據爲UTF-8並使用UTF-8作爲表/數據庫/列的默認字符集。

在​​我發現一個有趣的方法:

mysqldump myDB | sed -i 's/CHARSET=latin1/CHARSET=utf8/g' | iconv -f latin1 -t utf8 | mysql myDB2 

我還沒有嘗試過,但是否有什麼注意事項?

有沒有辦法直接在MySQL shell中做到這一點?

[編輯:]

SHOW CREATE TABLE messages;結果運行ALTER TABLE messages CONVERT TO CHARACTER SET utf8mb4;

CREATE TABLE `messages` (
    `number` int(11) NOT NULL AUTO_INCREMENT, 
    `status` enum('0','1','2') NOT NULL DEFAULT '1', 
    `user` varchar(30) NOT NULL DEFAULT '', 
    `comment` varchar(250) NOT NULL DEFAULT '', 
    `text` mediumtext NOT NULL, 
    `date` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`number`), 
    KEY `index_user_status_date` (`user`,`status`,`date`) 
) ENGINE=InnoDB AUTO_INCREMENT=3285217 DEFAULT CHARSET=utf8mb4 

回答

2

這是可能的錶轉換。但是你也需要轉換應用程序。

ALTER TABLE tab1 CONVERT TO utf8mb4; 
etc. 

檢查,做SHOW CREATE TABLE tab1;它應該顯示你CHARACTER SET utf8mb4

注:有3件事怎麼回事:

  • 轉換數據的編碼在任何VARCHARTEXT列。
  • 更改CHARACTER SET這樣的列。
  • 更改表格的DEFAULT CHARACTER SET - 如果您添加任何新的列而不指定字符集,這會發揮作用。

的應用...

當您從客戶到MySQL連接,你需要告訴它,在一個特定的應用程序,方式或通過SET NAMES,在客戶端的字節編碼。 不是必須與列聲明相同;如有必要,轉換將發生在INSERTSELECT期間。

我建議您進行備份和/或測試其中一個表的副本。請確保完全通過 - 插入,選擇,顯示等。

+0

我運行了'ALTER TABLE tab1 CONVERT TO CHARACTER SET utf8mb4;'你說'轉換任何VARCHAR和TEXT列中的數據編碼發生在那一步。這也是我在https://dev.mysql.com/doc/refman/5.7/en/alter-table.html#alter-table-character-set中找到的。但實際上**存儲在我的表中的數據沒有被轉換** - 它仍然在'Latin-1' - 只有默認值和某些列的數據類型發生了變化(我運行了'diff dump_before_convert.sql dump_after_cobert.sql'轉儲)。如何將當前存儲在'latin-1'中的數據轉換爲'utf-8mb4'? –

+0

請顯示當前的'SHOW CREATE TABLE'(至少對於該列)和'SELECT HEX(col)...'。如果沒有這兩種情況,很難說列中的實際情況,以及是否可以。 –

相關問題