MySQL 8.0:字符集從 utf8 轉換成 utf8mb4

整理 MySQL 8.0 文檔時發現一個變更:

默認字符集由 latin1 變為 utf8mb4。想起以前整理過字符集轉換文檔,升級到 MySQL 8.0 後大概率會有字符集轉換的需求,在此正好分享一下。

當時的需求背景是:

部分系統使用的字符集是 utf8,但 utf8 最多隻能存 3 字節長度的字符,不能存放 4 字節的生僻字或者表情符號,因此打算遷移到 utf8mb4。

遷移方案一

1. 準備新的數據庫實例,修改以下參數:

[mysqld]## Character Settingsinit_connect='SET NAMES utf8mb4'#連接建立時執行設置的語句,對super權限用戶無效character-set-server = utf8mb4collation-server = utf8mb4_general_ci#設置服務端校驗規則,如果字符串需要區分大小寫,設置為utf8mb4_binskip-character-set-client-handshake#忽略應用連接自己設置的字符編碼,保持與全局設置一致## Innodb Settingsinnodb_file_format = Barracudainnodb_file_format_max = Barracudainnodb_file_per_table = 1innodb_large_prefix = ON#允許索引的最大字節數為3072(不開啟則最大為767字節,對於類似varchar(255)字段的索引會有問題,因為255*4大於767)

2. 停止應用,觀察,確認不再有數據寫入

可通過 show master status 觀察 GTID 或者 binlog position,沒有變化則沒有寫入。

3. 導出數據

先導出表結構:

mysqldump -u -p --no-data --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --databases testdb > /backup/testdb.sql

後導出數據:

mysqldump -u -p --no-create-info --master-data=2 --flush-logs --routines --events --triggers --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --database testdb > /backup/testdata.sql

4. 修改建表語句

修改導出的表結構文件,將表、列定義中的 utf8 改為 utf8mb4

5. 導入數據

先導入表結構:

mysql -u -p testdb < /backup/testdb.sql

後導入數據:

mysql -u -p testdb < /backup/testdata.sql

6. 建用戶

查出舊環境的數據庫用戶,在新數據庫中創建

7. 修改新數據庫端口,啟動應用進行測試

關閉舊數據庫,修改新數據庫端口重啟,啟動應用

遷移方案二

1. 修改表的字符編碼會鎖表,建議先停止應用

2. 停止 mysql,備份數據目錄(也可以其他方式進行全備)

3. 修改配置文件,重啟數據庫

[mysqld]## Character Settingsinit_connect='SET NAMES utf8mb4'#連接建立時執行設置的語句,對super權限用戶無效character-set-server = utf8mb4collation-server = utf8mb4_general_ci#設置服務端校驗規則,如果字符串需要區分大小寫,設置為utf8mb4_binskip-character-set-client-handshake#忽略應用連接自己設置的字符編碼,保持與全局設置一致## Innodb Settingsinnodb_file_format = Barracudainnodb_file_format_max = Barracudainnodb_file_per_table = 1innodb_large_prefix = ON#允許索引的最大字節數為3072(不開啟則最大為767字節,對於類似varchar(255) 字段的索引會有問題,因為255*4大於767)

4. 查看所有表結構,包括字段、修改庫和表結構,如果字段有定義字符編碼,也需要修改字段屬性,sql 語句如下:

修改表的校對規則:

alter table t convert to character set utf8mb4;

影響:拷貝全表,速度慢,會加鎖,阻塞寫操作

修改字段的校對規則(utfmb4 每字符佔 4 字節,注意字段類型的最大字節數與字符長度關係):

alter table t modify a char CHARACTER SET utf8mb4;

影響:拷貝全表,速度慢,會加鎖,阻塞寫操作

修改 database 的校對規則:

alter database sbtest CHARACTER SET utf8mb4;

影響:只需修改元數據,速度很快

5. 修改 JDBC url haracterEncoding=utf-8


分享到:


相關文章: