MySQL插入数据 “Incorrect string value“ 错误解析

最近在做项目的向一张评论表中插入数据的时候遇到了这个错误。几经辗转找到了报错的原因。

Incorrect string value 原因定位

我找到的原因是由于插入数据的字符集与表结构的默认字符集不匹配导致的这个问题。

举个例子,比如我们插入了一条数据,其中某个字段值包含了一个字符,这个字符是以四个字节进行编码的如"🔤"这样的。但是我们表结构的默认字符集最大允许三个字节作为一个字符,此时就会出现这个错误。

如下面我有这样一张表:

CREATE TABLE tb_description(
	id int(11) AUTO_INCREMENT COMMENT '主键',
	description varchar(1024) COMMENT '评论',
	create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	PRIMARY KEY(id)
)engine=InnoDB,charset=utf8;

这里我对应表的默认字符集为UTF8,此时如果我要插入一条这样的数据的话,

INSERT INTO tb_description(description)
VALUES("学到了😁");

就会复现上述的错误。
在这里插入图片描述

问题解决

异常原因找到了,那么解决方式也很简单。只需要修改字符集为合适的字符集即可。这里我们需要将建表时设置的字符集 utf8修改为支持四字节字符集utf8bm4即可。

一种方式是删表重建:

DROP TABLE IF EXISTS tb_description;
CREATE TABLE tb_description(
	id int(11) AUTO_INCREMENT COMMENT '主键',
	description varchar(1024) COMMENT '评论',
	create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	PRIMARY KEY(id)
)engine=InnoDB,charset=utf8mb4;
-- 这里在将原来的 charset=utf8 修改为了 cahrset=utf8mb4

这种方式只适用于开发时,或者刚刚建表且生产环境没有生产数据的情况。

如果遇到需要修改生产环境下的表结构时则需要用下面的语句:

ALTER TABLE tb_description DEFAULT CHARACTER SET utf8mb4;

原因分析

正常情况 utf-8 是一种可变长度的字符集,它的单个字符的长度范围可以在1~4字节之间变化。由于其支持字符范围广并且传输效率高而被广泛使用。虽然在 Windows 中我们默认用的还是 gbk字符集 ,但是在使用浏览器浏览网站的时候大部分网站其实已经在广泛使用 utf-8字符集了。

而在 MySQL 当中由于一些历史原因,其直接支持的 utf-8 格式并非完全版的 utf-8。简单来说MySQL中的utf-8字符集并不完全支持utf-8具体表现就是只能保存最长字节为三字节的字符,而对于四字节编码的字符时,就会无法保存,并且抛出 Incorrect string value异常来声明"你输入了我无法识别的字符"。

为了解决无法保存四字节编码的utf-8字符的问题,MySQL在5.3.3版本时推出了 utf8mb4字符集。因此我们在使用时如果存在目标字段值中有emoji或者生僻字的情况时,最好使用 utf8mb4 字符集建表。

参考资料

总结:被MySQL UTF8编码坑的惨痛教训…
mysql不能识别4个字节的utf8编码的字符
mysql修改默认的环境的字符集为utf-8
MySQL字符集 GBK、GB2312、UTF8区别 解决MYSQL中文乱码问题
How to support full Unicode in MySQL databases

  • 30
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: "incorrect string value" 通常表示在将字符串插入数据库时,遇到了不能处理的字符集问题。这可能是由于数据库的字符集设置与实际数据的字符集不匹配导致的。解决方法可以是在连接数据库时设置正确的字符集,或者在数据库中修改字符集设置。 ### 回答2: MySQL错误信息 "incorrect string value" 是由于插入或更新数据库中的字符串时,该字符串包含不允许或无法识别的字符导致的。 这个错误通常是由于数据库的字符集和字符串不匹配引起的。例如,如果数据库使用的是Latin1字符集,而你尝试插入包含Unicode字符的字符串,就会出现这个错误。解决这个问题的方法是确保数据库的字符集与字符串的字符集匹配。 解决这个问题的方法有两种: 1. 更改数据库字符集:你可以通过修改数据库的字符集来解决该问题。通过在创建数据库或表时指定正确的字符集。例如,可以使用以下命令创建一个使用UTF-8字符集的数据库: CREATE DATABASE dbname DEFAULT CHARACTER SET utf8; 2. 转换字符串的字符集:如果你无法更改数据库的字符集,你可以尝试将插入或更新的字符串转换为数据库支持的字符集。在插入或更新字符串之前,可以使用MySQL的CONVERT函数将字符串从一种字符集转换为另一种字符集。例如,可以使用以下语句将字符串从UTF-8转换为Latin1字符集: INSERT INTO tablename (columnname) VALUES (CONVERT('字符串',BINARY)); 总的来说,要解决MySQL错误"incorrect string value",需要确保数据库字符集和插入或更新的字符串字符集一致。通过更改数据库字符集或转换字符串字符集,可以解决这个问题。 ### 回答3: 当MySQL返回错误消息 "Incorrect string value"时,通常是因为在插入或更新字符串值时使用了不兼容的字符集或编码引起的。 MySQL默认使用的字符集是utf8mb4,该字符集可以存储所有的Unicode字符。如果插入或更新的字符串包含无法被当前字符集支持的字符,就会出现错误 "Incorrect string value"。 解决方法有以下几种: 1. 修改表的字符集:可以通过修改表的默认字符集为utf8mb4来支持更多的字符。如: ALTER TABLE <表名> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2. 修改列的字符集:可以通过修改列的字符集为utf8mb4来支持更多的字符。如: ALTER TABLE <表名> MODIFY COLUMN <列名> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 3. 修改连接字符集:可以在连接数据库之前执行以下命令,将连接的字符集修改为utf8mb4。如: SET NAMES 'utf8mb4'; 4. 修改MySQL服务器的配置文件:找到MySQL服务器的配置文件(一般是my.cnf或my.ini),添加以下参数: [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci 重启MySQL服务器使配置生效。 以上方法可以帮助解决MySQL错误 "Incorrect string value"。根据具体情况选择合适的方法进行调整即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值