MySQL 插入中文报错 ERROR 1366 (HY000): Incorrect string value 的完整解决记录一、问题现象今天在 MySQL 中新建了一个数据库和表准备插入一些测试数据。当插入英文字符时一切正常但插入中文时却报错了。1. 复现步骤-- 创建数据库mysqlcreatedatabaseaa;Query OK,1rowaffected(0.00sec)-- 切换数据库mysqluseaa;Databasechanged-- 创建测试表mysqlcreatetablebb(namevarchar(255),ageint);Query OK,0rowsaffected(0.01sec)-- 尝试插入中文数据报错mysqlinsertintobbvalues(张三,23);ERROR1366(HY000): Incorrect stringvalue:\xE5\xBC\xA0\xE4\xB8\x89forcolumnnameatrow1-- 插入英文数据正常mysqlinsertintobbvalues(zhangsan,23);Query OK,1rowaffected(0.00sec)2. 错误信息解读错误码ERROR 1366 (HY000)错误提示Incorrect string value: \xE5\xBC\xA0\xE4\xB8\x89 for column name at row 1含义第 1 行的name列的字符串值不正确无法识别中文编码。二、问题排查1. 查看表结构mysqlshowcreatetablebb;输出结果------------------------------------------------------------------------------------------------------------------------------------|Table|CreateTable|------------------------------------------------------------------------------------------------------------------------------------|bb|CREATETABLEbb(namevarchar(255)DEFAULTNULL,ageint(11)DEFAULTNULL)ENGINEInnoDBDEFAULTCHARSETlatin1|------------------------------------------------------------------------------------------------------------------------------------发现问题表的默认字符集是latin1而不是utf8。latin1是单字节编码无法存储中文。三、第一次尝试修改表的默认字符集参考网上的方法先尝试修改表的默认字符集mysqlaltertablebbdefaultcharactersetutf8;Query OK,0rowsaffected(0.00sec)Records:0Duplicates:0Warnings:0修改后再次查看表结构mysqlshowcreatetablebb;输出结果-------------------------------------------------------------------------------------------------------------------------------------------------------|Table|CreateTable|-------------------------------------------------------------------------------------------------------------------------------------------------------|bb|CREATETABLEbb(namevarchar(255)CHARACTERSETlatin1DEFAULTNULL,ageint(11)DEFAULTNULL)ENGINEInnoDBDEFAULTCHARSETutf8|-------------------------------------------------------------------------------------------------------------------------------------------------------注意虽然表的默认字符集已经变成了utf8但name列的字符集仍然是latin1再次插入中文测试mysqlinsertintobbvalues(张三,23);ERROR1366(HY000): Incorrect stringvalue:\xE5\xBC\xA0\xE4\xB8\x89forcolumnnameatrow1结论只修改表的默认字符集是不够的列的字符集没有随之改变。四、第二次尝试修改列的字符集需要单独修改name列的字符集为utf8mysqlaltertablebb change name namevarchar(20)charactersetutf8;Query OK,1rowaffected(0.04sec)Records:0Duplicates:0Warnings:0再次插入中文mysqlinsertintobbvalues(张三,23);Query OK,1rowaffected(0.00sec)成功五、验证结果mysqlselect*frombb;----------------|name|age|----------------|zhangsan|23||张三|23|----------------2rowsinset(0.00sec)中文数据已经成功插入并正常显示。六、问题总结核心原因MySQL 中表级别的默认字符集和列级别的字符集是分开的层级作用范围说明数据库级别整个数据库影响新建表的默认字符集表级别整张表影响新建列的默认字符集列级别单个字段决定该字段实际存储的编码当使用alter table ... default character set utf8时只修改了表级别的默认字符集已经存在的列的字符集不会自动改变。正确解决方法方法一修改已有列的字符集适用于已有数据的表-- 修改指定列的字符集altertable表名 change 列名 列名 数据类型charactersetutf8;-- 示例altertablebb change name namevarchar(20)charactersetutf8;如果表中有多个包含中文的列需要逐个修改。方法二建表时直接指定字符集推荐CREATETABLEbb(nameVARCHAR(255),ageINT)ENGINEInnoDBDEFAULTCHARSETutf8;或者更规范地在列级别也指定CREATETABLEbb(nameVARCHAR(255)CHARACTERSETutf8,ageINT)ENGINEInnoDBDEFAULTCHARSETutf8;方法三修改数据库默认字符集-- 修改数据库默认字符集alterdatabase数据库名charactersetutf8;七、举一反三如果在修改列之后插入中文仍然报错可能是以下原因客户端连接字符集不一致检查客户端编码showvariableslikecharacter_set_%;确保character_set_client、character_set_connection、character_set_results都是utf8。其他列仍使用 latin1如果表中有多个字段需要存储中文需要逐一检查并修改。数据库或服务器级别的默认字符集可以通过修改 MySQL 配置文件my.cnf或my.ini来设置全局默认字符集[mysqld] character-set-serverutf8 collation-serverutf8_general_ci [client] default-character-setutf8八、总结操作命令效果修改表默认字符集alter table ... default character set utf8只影响新列不影响已有列修改列字符集alter table ... change ... character set utf8真正解决已有列的中文存储问题建表时指定CREATE TABLE ... DEFAULT CHARSETutf8从根源上避免问题建议在涉及中文存储的场景下建表时务必显式指定DEFAULT CHARSETutf8避免后续踩坑。如果这篇文章对你有帮助欢迎点赞收藏有问题欢迎在评论区交流。