news 2026/4/26 6:31:43

MySQL 插入中文报错 ERROR 1366 (HY000): Incorrect string value 的解决办法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 插入中文报错 ERROR 1366 (HY000): Incorrect string value 的解决办法

MySQL 插入中文报错 ERROR 1366 (HY000): Incorrect string value 的完整解决记录

一、问题现象

今天在 MySQL 中新建了一个数据库和表,准备插入一些测试数据。当插入英文字符时一切正常,但插入中文时却报错了。

1. 复现步骤

-- 创建数据库mysql>createdatabaseaa;Query OK,1rowaffected(0.00sec)-- 切换数据库mysql>useaa;Databasechanged-- 创建测试表mysql>createtablebb(namevarchar(255),ageint);Query OK,0rowsaffected(0.01sec)-- 尝试插入中文数据(报错!)mysql>insertintobbvalues('张三',23);ERROR1366(HY000): Incorrect stringvalue:'\xE5\xBC\xA0\xE4\xB8\x89'forcolumn'name'atrow1-- 插入英文数据(正常)mysql>insertintobbvalues("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. 查看表结构

mysql>showcreatetablebb;

输出结果:

+-------+-----------------------------------------------------------------------------------------------------------------------------+|Table|CreateTable|+-------+-----------------------------------------------------------------------------------------------------------------------------+|bb|CREATETABLE`bb`(`name`varchar(255)DEFAULTNULL,`age`int(11)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=latin1|+-------+-----------------------------------------------------------------------------------------------------------------------------+

发现问题:表的默认字符集是latin1,而不是utf8latin1是单字节编码,无法存储中文。


三、第一次尝试:修改表的默认字符集

参考网上的方法,先尝试修改表的默认字符集:

mysql>altertablebbdefaultcharactersetutf8;Query OK,0rowsaffected(0.00sec)Records:0Duplicates:0Warnings:0

修改后再次查看表结构:

mysql>showcreatetablebb;

输出结果:

+-------+------------------------------------------------------------------------------------------------------------------------------------------------+|Table|CreateTable|+-------+------------------------------------------------------------------------------------------------------------------------------------------------+|bb|CREATETABLE`bb`(`name`varchar(255)CHARACTERSETlatin1DEFAULTNULL,`age`int(11)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8|+-------+------------------------------------------------------------------------------------------------------------------------------------------------+

注意:虽然表的默认字符集已经变成了utf8,但name列的字符集仍然是latin1

再次插入中文测试:

mysql>insertintobbvalues("张三",23);ERROR1366(HY000): Incorrect stringvalue:'\xE5\xBC\xA0\xE4\xB8\x89'forcolumn'name'atrow1

结论:只修改表的默认字符集是不够的,列的字符集没有随之改变


四、第二次尝试:修改列的字符集

需要单独修改name列的字符集为utf8

mysql>altertablebb change name namevarchar(20)charactersetutf8;Query OK,1rowaffected(0.04sec)Records:0Duplicates:0Warnings:0

再次插入中文:

mysql>insertintobbvalues("张三",23);Query OK,1rowaffected(0.00sec)

成功!


五、验证结果

mysql>select*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)ENGINE=InnoDBDEFAULTCHARSET=utf8;

或者更规范地,在列级别也指定:

CREATETABLEbb(nameVARCHAR(255)CHARACTERSETutf8,ageINT)ENGINE=InnoDBDEFAULTCHARSET=utf8;
方法三:修改数据库默认字符集
-- 修改数据库默认字符集alterdatabase数据库名charactersetutf8;

七、举一反三

如果在修改列之后,插入中文仍然报错,可能是以下原因:

  1. 客户端连接字符集不一致:检查客户端编码

    showvariableslike'character_set_%';

    确保character_set_clientcharacter_set_connectioncharacter_set_results都是utf8

  2. 其他列仍使用 latin1:如果表中有多个字段需要存储中文,需要逐一检查并修改。

  3. 数据库或服务器级别的默认字符集:可以通过修改 MySQL 配置文件(my.cnfmy.ini)来设置全局默认字符集:

    [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8

八、总结

操作命令效果
修改表默认字符集alter table ... default character set utf8只影响新列,不影响已有列
修改列字符集alter table ... change ... character set utf8真正解决已有列的中文存储问题
建表时指定CREATE TABLE ... DEFAULT CHARSET=utf8从根源上避免问题

建议:在涉及中文存储的场景下,建表时务必显式指定DEFAULT CHARSET=utf8,避免后续踩坑。


如果这篇文章对你有帮助,欢迎点赞收藏!有问题欢迎在评论区交流。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 6:21:56

需求预测系统:基于多因素的时间序列预测

需求预测系统:基于多因素的时间序列预测 在当今快速变化的市场环境中,企业需要精准预测需求以优化库存、降低成本并提升客户满意度。传统的需求预测方法往往依赖单一历史数据,难以应对复杂多变的市场因素。基于多因素的时间序列预测系统通过…

作者头像 李华
网站建设 2026/4/26 6:20:49

C语言内存安全“最后一公里”突破:基于Control Flow Integrity + Memory Tagging Extension的2026双模防护实践(ARMv9/M1 Ultra实测数据)

更多请点击: https://intelliparadigm.com 第一章:C语言内存安全演进与2026规范全景图 C语言自1972年诞生以来,其“零成本抽象”与直接内存控制能力成就了操作系统、嵌入式系统和高性能基础设施的基石地位;但裸指针、隐式类型转换…

作者头像 李华
网站建设 2026/4/26 6:17:23

DevChat实战:从提示词到自动化工作流,重塑开发效率

1. 从“代码搬运工”到“AI指挥官”:DevChat如何重塑我的开发日常作为一名在代码堆里摸爬滚打了十多年的老程序员,我经历过从记事本写HTML到IDE智能补全的变迁。这两年,AI编程助手(Copilot、Cursor)和低代码工作流平台…

作者头像 李华
网站建设 2026/4/26 6:17:20

LSTM在时间序列预测中的优势与局限分析

1. LSTM在时间序列预测中的适用性探讨长短期记忆网络(LSTM)作为一种特殊的循环神经网络(RNN),自1997年由Hochreiter和Schmidhuber提出以来,在序列建模领域展现了强大的能力。与传统RNN不同,LSTM通过精心设计的"门控机制"解决了长期…

作者头像 李华
网站建设 2026/4/26 6:11:49

Phi-3-Mini-128K多轮对话效果展示:如何维持上下文一致性?

Phi-3-Mini-128K多轮对话效果展示:如何维持上下文一致性? 和AI聊天,最怕什么?聊着聊着,它就把前面说过的话给忘了。你刚告诉它你是个程序员,喜欢Python,转头它可能就问你:“要不要试…

作者头像 李华