作者:胡呈清
整理 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