為什麼需要升級
最近,因業務方的數據庫支持utf8mb4,而datax同步工具還停留在支持utf8字符集上。導致一些同步任務無法正確同步emoji等表情符號字段,出現大量的亂碼。
mysql 5.5.3版本之前,utf8編碼最多支持3個字節,也就是BMP這部分的編碼區,范圍0000~FFFF這一部分。
mysql 5.5.3 之後的版本,增加utf8mb4, 官方介紹它是向下兼容utf8字符集,比utf8能標示更多的字符。
目前了解到的情況,大部分移動項目,因為要存儲用戶的文本,會存儲大量的emoji等表情符號,這種會需要utf8mb4的支持。
升級兼容性問題
utf8mb4作為utf8的超集,也是向下兼容utf8的,所以不用擔心字符的兼容性問題。
但是切換後生效,需要重新啟動mysql服務端,對業務庫會存在一定的影響。(官方文檔介紹說是動態修改配置,本人沒有測試過,但是參考發部分的文檔,都是需要重啟才會生效。)
升級後,重跑了一輪mysql相關插件的測試集,無任何異常。可以證明升級後datax mysql插件的兼容性是沒有影響的。
升級步驟
檢查mysql版本。如果版本低於5.5.3,請先升級mysql server。
修改 /etc/my.cnf
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
修改database、table和column字符集(根據自身的情況決定)
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
重啟服務後,檢查字符’
重啟:sudo /etc/init.d/mysql restart
進入mysql命令行 :mysql -h localhost -uroot -proot
檢查字符集
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.01 sec)
備注:
必須保證
charactersetclient/charactersetconnection/charactersetdatabase/charactersetresults/charactersetserver為utf8mb4。
這幾個變量的意義如下:
– charactersetserver:默認的內部操作字符集
– charactersetclient:客戶端來源數據使用的字符集
– charactersetconnection:連接層字符集
– charactersetresults:查詢結果字符集
– charactersetdatabase:當前選中數據庫的默認字符集
– charactersetsystem:系統元數據(字段名等)字符集
Mysql字符集設置的詳細介紹:
MySQL字符集設置
• 系統變量:
– character_set_server:默認的內部操作字符集
– character_set_client:客戶端來源數據使用的字符集
– character_set_connection:連接層字符集
– character_set_results:查詢結果字符集
– character_set_database:當前選中數據庫的默認字符集
– character_set_system:系統元數據(字段名等)字符集
– 還有以collation_開頭的同上面對應的變量,用來描述字符序。
• 用introducer指定文本字符串的字符集:
– 格式為:[_charset] ‘string’ [COLLATE collation]
– 例如:
• SELECT _latin1 ‘string’;
• SELECT _utf8 ‘你好’ COLLATE utf8_general_ci;
– 由introducer修飾的文本字符串在請求過程中不經過多余的轉碼,直接轉換為內部字符集處理。
MySQL中的字符集轉換過程
1. MySQL Server收到請求時將請求數據從character_set_client轉換為character_set_connection;
2. 進行內部操作前將請求數據從character_set_connection轉換為內部操作字符集,其確定方法如下:
• 使用每個數據字段的CHARACTER SET設定值;
• 若上述值不存在,則使用對應數據表的DEFAULT CHARACTER SET設定值(MySQL擴展,非SQL標准);
• 若上述值不存在,則使用對應數據庫的DEFAULT CHARACTER SET設定值;
• 若上述值不存在,則使用character_set_server設定值。
3. 將操作結果從內部操作字符集轉換為character_set_results。
檢查使用配置
檢查mysql-connector 版本,需要高於5.1.3版本,否則無法使用utf8mb4
假設使用jdbc-url進行連接,需要注意characterEncoding=utf8可以被自動被識別為utf8mb4(當然也兼容原來的utf8).
jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE