症状
插入以 Incorrect string value 失败,消息显示如四字节 emoji 的字节序列,并指出列名。MySQL 的 utf8mb3 无法存储需要四字节的字符,因此 emoji 与部分 CJK 扩展字符会失败。连接字符集与列不一致时,即便列支持该字符也会被拒。
诊断
查看 character_set 变量与建表语句;把列与表转为 utf8mb4;设置连接字符集。
mysql -e "show variables like 'character_set%'; show create table t\G"
根因
值包含列字符集无法表示的字符,最常见是 utf8mb3 列中的四字节字符,或连接字符集与列不一致。
修复
把受影响的表与列转为 utf8mb4;连接与客户端字符集设为一致;使用请求 utf8mb4 的连接串。三层都要对齐,只改列会让连接层仍能拒绝或损坏数据。
验证
插入此前失败的值确认存储成功,再读回比对确认未被损坏。原样往返即证明字符集端到端正确。
常见陷阱
仅在连接层设置 utf8mb4 而列仍为 utf8mb3 会在写入时再次失败;应同时转换列。