踩坑实录-datax数据推送字符集错误

2022-11-13 13:09:57 浏览数 (1)

背景: 使用datax工具将一张表从hive推送数据到mysql

报错:

代码语言:javascript复制
Incorrect string value: '\xF0\xA5\x96\x84' for column 'user_name' at row

产生原因分析: 普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战、避免 emoji 表情符号带来的问题、涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集,这必须要作为移动互联网行业的一个技术选型的要点。

解决方法:

1、暴力去掉特殊的表情符

代码语言:javascript复制
content = content.replaceAll("[\x{10000}-\x{10FFFF}]", "");

2、改变字符集

ps:需要 >= MySQL 5.5.3版本、从库也必须是5.5的了、低版本不支持这个字符集、复制报错

修改表字段字符集为utf8mb4:

代码语言:javascript复制
--修改数据库默认的字符集
--注意:虽然修改了database的字符集为utf8mb4,但只修改了database以后新创建的表的字符集,默认使用utf8mb4,原来已经存在的表,字符集不会变,需要手动为每张表设置字符集
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci


--修改表默认的字符集
--只修改表默认的字符集
ALTER TABLE table_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
--修改表默认的字符集和所有字符列的字符集
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4  COLLATE utf8mb4_general_ci

--修改字段默认的字符集
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

0 人点赞