00.序言
发现mysql库里面的表和maxcompute里面的表条数不一样,找了半天发现是导入数据的时候有脏数据,被忽略了..
01.问题
从问题日志里发现: ERROR StdoutPluginCollector - 脏数据: {"exception":"Incorrect string value: '\\xF0\\x9F\\x92\\x94' for column 'conntent' at row 1"
02.解决方案
因为内容里面有emoji表情包,所以普通的utf-8进不去。
utf-8 是变化长度的编码,储存需要1~4个字节
然而,mysql的utf8只存储最多3个字节。所以有些字符存不进去,像emoji表情等。
为了兼容4字节,MySQL在5.5.3之后增加了这个utf8mb4的编码。
建库,建表时,强烈建议编码使用utf8mb4。
在设计数据库表的字符集时,注意一下,不仅表要设置,有时候语句里面也有特定设置,注意优先级,不然会被覆盖掉。
ALTER TABLE `ads_vos_social_data`
MODIFY COLUMN `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL AFTER `title`;
优先级:
如果全都显示设置了,那么优先级顺序是 SQL语句 > 列级别设置 > 表级别设置 > 库级别设置 > 服务器别设置