背景: 使用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;