mysql输入中文报错:ERROR 1366 (HY000): Incorrect string value: ‘\xE9\x83\x9D\xE7\x8E\x89...‘

mysql输入中文报错:ERROR 1366 (HY000): Incorrect string value: '\xE9\x83\x9D\xE7\x8E\x89…'解决方法

强烈建议在创建数据库和创建表时就设置好数据库的编码格式。

一、直接修改配置文件方法:

推荐此方法,比较我们现在主要的目的是解决这个编码问题,当然有时间可以查看后面通过命令行修改编码的方法。
在这里插入图片描述
在安装目录找到配置文件my.in文件,修改里面的两个字符即可。

default-character-set=gbk      客户端编码设置
character-set-server=utf8      服务器端编码设置

在这里插入图片描述

二、命令行中修改相关编码方法:

01、MySQL查询代码:

输入代码:

show variables like'%char%';

结果:

+--------------------------+-----------------------------------------------------------+
| Variable_name            | Value                                                     |
+--------------------------+-----------------------------------------------------------+
| character_set_client     | gbk                                                      |
| character_set_connection | gbk                                                      |
| character_set_database   | gbk                                                      |
| character_set_filesystem | binary                                                    |
| character_set_results    | gbk                                                       |
| character_set_server     | latin1                                                    |
| character_set_system     | utf8                                                     |
| character_sets_dir       | /usr/local/mysql-5.7.21-macos10.13-x86_64/share/charsets/ |
+--------------------------+-----------------------------------------------------------+

看到是gbk和latin1说明不支持中文,所以需要修改字符类型

当结果为一下示例时就支持中文字符了:

+--------------------------+-----------------------------------------------------------+
| Variable_name            | Value                                                     |
+--------------------------+-----------------------------------------------------------+
| character_set_client     | utf8                                                      |
| character_set_connection | utf8                                                      |
| character_set_database   | utf8                                                      |
| character_set_filesystem | binary                                                    |
| character_set_results    | utf8                                                      |
| character_set_server     | latin1                                                    |
| character_set_system     | utf8                                                      |
| character_sets_dir       | /usr/local/mysql-5.7.21-macos10.13-x86_64/share/charsets/ |
+--------------------------+-----------------------------------------------------------+

小小科普:
在latin1中,每个字符只有一个字节长。在utf8中,一个字符可以由多个字节组成。因此,utf8具有比latin1更多的字符(并且它们具有的字符不一定由相同的字节/字节序列表示)。但是我们的中文汉字是要2个字节还是3个字节哦,所有latin1就不能存储汉字啦。

02、在创建数据库时就声明字符类型为utf8

优点:一劳永逸,在创建数据库时就设置为utf8格式,以后再次数据库下创建表时以及添加表数据时都不用担心中文字符问题。
代码示例:

CCREATE database 数据库名字 DEFAULT CHARACTER SET utf8;
//此处以test01数据库为例

查看是否设置成功:
在这里插入图片描述此时在数据库test01下新建表和插入数据时输入中文不会提示任何错误。

03、已有数据库和数据表修改为utf8格式

适用场景:适用于某一现有的数据表,但是仅仅只能修改当前表的字符格式,在此数据库下创建新表时还需要修改字符格式为utf8;

  1. 查询表的属性,示例代码:
/ /首先查看表teble02的列的属性
show full columns from table02;

  1. 结果如下(由图可知不能使用中文字符):
    在这里插入图片描述
  2. 修改表的列属性为utf8:
alter table table02 change name name varchar(255) character set utf8 collate utf8_unicode_ci not null default '';
  1. 结果如下(由图可知此时可以使用中文字符):
    在这里插入图片描述

04、在创建数据表时设置为utf8格式

在创建数据表的时候就将其设置为utf8格式。
以创建数据表:app为例,代码如下:

 create table app(
 id int not null auto_increment,
 name varchar(100) not null,
 age int null,
 primary key(id)
 )engine = InnoDB default charset=utf8;

在这里插入图片描述

更多绿色、pj资源请关注wx公众号:菜鸟资源分享
更多绿色、pj资源请关注wx公众号:菜鸟资源分享
更多绿色、pj资源请关注wx公众号:菜鸟资源分享
更多绿色、pj资源请关注wx公众号:菜鸟资源分享

<think>嗯,用户遇到了MySQL插入中文数据时常见的ERROR1366报错,这个错误确实让人头疼。从用户引用的资料来看,ta应该已经尝试过网上常见的解决方案但仍有困惑,特别是关于"name"字段的处理。用户明显需要更系统化的排查思路,而不仅仅是碎片化的建议。用户提供的引用信息很有价值。引用3特别关键,它揭示了Windows环境下命令行编码与数据库编码不匹配的核心矛盾。这个案例很典型——用户可能在Windows操作,但数据库设置是UTF-8,而系统终端的默认编码却是GBK,导致字节序列不匹配。不过用户现在更关注具体字段&#39;name&#39;的处理,说明ta可能已经意识到不同字段可以有不同的处理方式。值得注意用户引用中反复出现的模式:-错误信息都显示十六进制字节值(如\xE6\x9D\x8E\xE5\x8B\x87)-集中在插入操作时发生-涉及&#39;Sname&#39;&#39;duties&#39;等不同字段这说明问题具有普遍性,不是单个字段的特例。但用户特别点名&#39;name&#39;字段,或许该字段有特殊配置。用户深层需求应该是想得到可操作的完整解决方案,而不仅是理论解释。ta可能已经尝试过修改my.cnf或altertable但未奏效,所以需要更精细的排查步骤。考虑到ta引用中提到的navicat成功案例,或许可以强调图形化工具作为临时解决方案的价值。需要特别注意用户对"国际化utf8"的坚持(引用3),这说明ta有跨语言支持需求,绝对不能建议改用gbk编码。解决方案必须围绕utf8mb4展开,这也是现代MySQL的最佳实践。技术层面要分三层排查:1校验字节序列(引用中显示的\xE6\x9D\x8E是"李"的utf8编码)2确认字段级字符集继承关系3检查连接环境是否透传编码特别是执行SHOWCREATETABLE的输出分析,用户可能需要具体案例演示。突然想到用户没说清应用环境(PHP/Python等),但命令行测试失败是最小复现场景,应该优先解决。如果应用层连接也失败,还需要检查连接字符串的charset参数——这点要提醒但不必展开,避免偏离核心问题。最后要强调备份的重要性。用户引用3提到"弄了一整天",说明可能经历过失败操作,ALTERTABLE转换有数据丢失风险,必须给出明确警告。</think> MySQL插入中文字符时出现`ERROR 1366 (HY000): Incorrect string value`的根本原因是 **字符集不匹配**。以下是针对列`&#39;name&#39;`的系统性解决方案: --- ### 错误原因分析(以`&#39;name&#39;`列为例) 1. **数据字节不兼容** 中文字符在客户端为UTF-8编码(如`张三`= `\xE5\xBC\xA0\xE4\xB8\x89`),但: - 目标列字符集不支持(如`latin1`) - 连接会话字符集与客户端不匹配 2. **关键冲突点** $$ \text{客户端编码} \neq \text{连接层编码} \neq \text{数据库字符集} $$ --- ### 逐步解决方案 #### 🔹 **第一步:校验字段字符集** ```sql SHOW FULL COLUMNS FROM 表名 WHERE Field = &#39;name&#39;; ``` 检查输出中的 `Collation` 列: - 正确值应为 `utf8mb4_general_ci` 或 `utf8mb4_unicode_ci` - **错误值示例**:`latin1_swedish_ci` #### 🔹 **第二步:修正字段字符集** ```sql ALTER TABLE 表名 MODIFY `name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ``` #### 🔹 **第三步:验证数据库默认字符集** ```sql SHOW VARIABLES LIKE &#39;character_set_database&#39;; ``` - 需返回 `utf8mb4` - 否则修改配置文件: ```ini [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci ``` #### 🔹 **第四步:检查连接层编码** 执行前设置会话编码: ```sql SET NAMES &#39;utf8mb4&#39;; -- 临时修复当前连接 INSERT INTO ... (name) VALUES (&#39;张三&#39;); -- 此时应成功 ``` > 📌 **Linux/Mac用户**:终端默认UTF-8,可直接操作 > ⚠️ **Windows用户**:需修改命令行字符集: > ```cmd > chcp 65001 && mysql -u root -p --default-character-set=utf8mb4 > ``` --- ### 特殊场景处理 #### 🔸 **Java/Python等程序插入失败** 在连接字符串显式指定编码: ```python # Python示例 db = pymysql.connect( host="localhost", charset="utf8mb4", # 关键参数 collation="utf8mb4_general_ci" ) ``` #### 🔸 **历史数据转换** 若表已有数据,需同步转换编码: ```sql ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ``` --- ### 🌟 核心原则 1. **四级统一策略** $$ \begin{align*} &\text{客户端工具编码} \\ &\rightarrow \text{连接层编码 (SET NAMES)} \\ &\rightarrow \text{数据库字符集} \\ &\rightarrow \text{表字段字符集} \end{align*} $$ 所有层级均需为`utf8mb4` 2. **拒绝妥协方案** - 不要改用`gbk`(牺牲国际化) - 优先修正编码而非转工具(如Navicat) > 📒 **引用总结**: > - Windows CMD默认GBK会导致UTF-8插入异常[^3] > - 图形化工具可绕过终端限制[^3] > - 列字符集必须显式定义[^1][^4] --- **相关问题** 1. 如果字段字符集已是`utf8mb4`但依然报错,如何排查? 2. MySQL的`utf8`和`utf8mb4`有什么区别?什么情况需用后者? 3. 如何批量转换已有数据库的字符集到`utf8mb4`? 4. 存储表情符号时出现相似错误(🙂 → ???),如何解决?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值