为什么需要升级
最近,因业务方的数据库支持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