萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql db字符集升級至utf8mb4的方案

mysql db字符集升級至utf8mb4的方案

mysql db字符集升級至utf8mb4我們可以通過修改mysql的配置文件來解決了,今天一起來看把字符修改成uft8mb4字符集的方法,具體細節如下所示。

為什麼需要升級

最近,因業務方的數據庫支持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

copyright © 萬盛學電腦網 all rights reserved