← 中文资源

简体中文版本

MySQL 报错 1366 列的值字符串不正确

通过让连接、列与表的字符集与所存数据一致,修复 MySQL 的 1366。

阅读英文原文

症状

插入以 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 会在写入时再次失败;应同时转换列。