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

作者:袖梨 2022-11-14

为什么需要升级

最近,因业务方的数据库支持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

相关文章

精彩推荐