Mysql

轉換字元編碼並檢查編碼是否存在問題

  • July 12, 2018

我打算將表格從utf8( _general_ci) 轉換為utf8mb4( utf8mb4_unicode_ci)。我想確保在轉換後我沒有任何格式錯誤的數據,所以我打算複製數據,在兩個表上執行連接,看看是否有任何差異。

這是一個很好的方法嗎?

Create table Email_utf8mb4  like Email;
insert into Email_utf8mb4 select * from Email;
ALTER TABLE Email_utf8mb4 
CONVERT TO CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci; 
select * from Email as old
join Email_utf8mb4 as new  
on old.notificationid =new.notificationid 
and (old.subject <> new.subject OR old.content <>
   new.content)

4.5. 假設沒有返回行…

drop Email; 
RENAME TABLE Email_utf8mb4 to Email;

subject並且content是我表中唯一的 alpha 列。

這不會修復或辨識表中已經存在的任何格式錯誤的數據。

是的,這是一個很好的技術。 ALTER..CONVERT TO..完成大部分工作。而且,由於 utf8 是 utf8mb4 的子集,因此在第 4 步中應該沒有發現任何差異。

但是,第 4 步仍有可能顯示某些內容。這是因為“相等”的定義(因此)對於vs<>是不同的。_general_ci``_unicode_ci

例如,在德語中,ss並且ß在 _general_ci(utf8 或 utf8mb4)中不相等,但在幾乎所有其他排序規則中都相等。例如,如果您目前有一個UNIQUE(or PRIMARY KEY) 的值與ssvs不同ß,則轉換將出現“重複鍵”錯誤的問題。

另一個有問題的對: aevsæ

一個不同的問題 - 不是相等,而是排序 - Ð<E用於 _unicode_ci,但不適用於其他排序規則。

同時,只要你在改變COLLATION,你還不如去utf8mb4_unicode_520_ci.

引用自:https://dba.stackexchange.com/questions/211939