SQL执行报错Incorrect string value: ‘\xF0\x9F\x98\x81\xF0\x9F...‘ for column ‘XXX‘ at row 1...

这篇具有很好参考价值的文章主要介绍了SQL执行报错Incorrect string value: ‘\xF0\x9F\x98\x81\xF0\x9F...‘ for column ‘XXX‘ at row 1...。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、报错

分享一个数据库执行插入和修改语句可能会出现的bug

Incorrect string value: ‘\xF0\x9F\x98\x81\xF0\x9F…’ for column ‘name’ at row 1…
SQL执行报错Incorrect string value: ‘\xF0\x9F\x98\x81\xF0\x9F...‘ for column ‘XXX‘ at row 1...,mysql,数据库,sql,数据库

再来看下实际项目中服务器报错打印的日志

SQL执行报错Incorrect string value: ‘\xF0\x9F\x98\x81\xF0\x9F...‘ for column ‘XXX‘ at row 1...,mysql,数据库,sql,数据库

二、原因

数据库某字段设置的是utf8字符集,在执行插入或修改语句时该字段传入的值是非utf8格式(表情或特殊字符)的内容。其实能出现这种问题的场景一般多是手机端。

SQL执行报错Incorrect string value: ‘\xF0\x9F\x98\x81\xF0\x9F...‘ for column ‘XXX‘ at row 1...,mysql,数据库,sql,数据库

我们都知道MySQL的utf8只支持最大3字节每字符,已经包含了控制符、拉丁文,中、日、韩等绝大多数国际字符,但还不是所有,例如手机端常用的表情字符 emoji表情和一些特殊字符,这些需要四个字节才能编码出来的,就需要对utf8进行扩展,于是就有了utf8mb4。
MySQL想要插入 4 字节长度的 UTF-8 字符,就需要使用 utf8mb4 字符集(mb4就是most bytes 4的意思,专门用来兼容四字节的unicode),但只有 5.5.3 版本以后的才支持。

三、示例

我有这么一张表

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  `password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
  `role` varchar(15) DEFAULT NULL COMMENT '角色',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET = utf8;

我的插入SQL这样写(name字段传入表情)

INSERT INTO `user` (name, password, role) 
VALUE ('😁😂😃👻', 'mypassword', 'admin');

那么执行的结果就会报错

INSERT INTO `user` (id, name, password, role) VALUE (NULL, '😁😂😃👻', 'mypassword', 'admin')
> 1366 - Incorrect string value: '\xF0\x9F\x98\x81\xF0\x9F...' for column 'name' at row 1
> 时间: 0.001s

报错信息很明显地告诉我们了,是name字段传入了不恰当的字符类型

四、解决办法

1. 将MySQL版本升级到5.5.3及以上。

-- 执行sql查询当前数据库的版本
select version();

关于MySQL的卸载与安装可以参我的考往期博文 —> 点击跳转 <—

2. 将字段的utf8字符集升级到utf8mb4

SQL执行报错Incorrect string value: ‘\xF0\x9F\x98\x81\xF0\x9F...‘ for column ‘XXX‘ at row 1...,mysql,数据库,sql,数据库

数据库的字符集编码是有优先级的:

优先级顺序为:数据库字符集 < 表字符集 < 字段字符集
当字符集不一致时,以小范围的为准,即字段设置的字符集优先级最高!

下面是通过sql修改字符编码:

--修改数据库字符集
ALTER DATABASE `数据库名` CHARACTER SET = utf8mb4;
--修改表字符集
ALTER TABLE `表名` convert to character set utf8mb4;
--修改字段字符集
ALTER TABLE `数据库名`.`表名` MODIFY COLUMN `字段名` VARCHAR(20) CHARACTER SET 
utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '字段名称注释';

想要更多了解MySQL常用排序规则utf8mb4_general_ci、utf8mb4_unicode_ci、utf8mb4_bin、utf8mb4_0900_ai_ci等,以及存储字符集 utf8 和 utf8mb4,可以看下这篇博文,总结的比较详尽 —> 点击跳转 <—

总结

 utf8mb4是utf8的超集,理论上原来使用utf8,然后将字符集修改为utf8mb4,也基本不会对已有的utf8编码数据的读取产生什么影响,不过为了utf8确实是更节省空间,我们一般情况下使用utf8也就够了。
 像一些不会对用户限制输入内容的varchar字段,还是尽量使用utf8mb4编码,正如我在文中说到的,这种使用utf8mb4的情况多是在手机端,因为我们限制不了用户往输入框里输入了什么字符,那么我们就必须向上或向下兼容了,通过牺牲部分空间和性能来换取平台的可靠性。
 一般来说,只要能找到满足当前需求的最好解决方案,那么技术选型就是正确的,如何取舍就看个人了。文章来源地址https://www.toymoban.com/news/detail-722138.html

到了这里,关于SQL执行报错Incorrect string value: ‘\xF0\x9F\x98\x81\xF0\x9F...‘ for column ‘XXX‘ at row 1...的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 报错 incorrect datetime value ‘0000-00-00 00:00:00‘ for column

    使用navicat导入数据时报错: MySQL 报错 incorrect datetime value ‘0000-00-00 00:00:00’ for column 这是因为当前的MySQL不支持datetime为0的情况。 MySQL报incorrect datetime value ‘0000-00-00 00:00:00’ for column错误原因,是由于在MySQL5.7版本以上,默认设置SQL_Mode模式,在模式里有NO_ZERO_DATE,NO_ZERO_IN_

    2024年02月12日
    浏览(44)
  • 【报错】Cannot deserialize value of type `java.time.LocalDateTime` from String

    接口测试中报错 这个错误是因为无法将字符串\\\"2023-10-10 17:23:35\\\"反序列化为java.time.LocalDateTime类型的对象。在Java中,LocalDateTime类不支持直接从字符串进行反序列化的操作。 在实体类的LocalDateTime 类型的字段上加@JsonFormat注解即可

    2024年02月03日
    浏览(61)
  • docker 报错 error: invalid character ‘\x00‘ looking for beginning of value

    执行docker build的时候报错:error: invalid character ‘x00’ looking for beginning of value。 环境: Docker version 20.10.17, build 100c701 windows docker desktop 4.10.1 WSL2 解决办法:https://github.com/docker/for-win/issues/12561 导致报错的原因是 meta.json 损坏,被写入了零值。 https://docs.docker.com/desktop/release-no

    2024年02月15日
    浏览(56)
  • MySQL版本不同带来Incorrect DATETIME value: ‘‘问题

    业务场景:线上数据同步到本地(开发测试) 版本:线上-5.7    本地-8.0 尝试操作方式: 1、SQL文件 2、备份还原 3、navicat自带传输工具 最终结果:只能备份其中的部分数据,视图同步下来出现  Incorrect DATETIME value: \\\'\\\' 问题 尝试解决方案: 按上述操作之后又会出现新的错误

    2024年02月13日
    浏览(47)
  • 报错:SON parse error: Cannot deserialize value of type `java.lang.String` from Array value (token `Jso

    详细报错 JSON parse error: Cannot deserialize value of type java.lang.String from Array value (token JsonToken.START_ARRAY ); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type java.lang.String from Array value (token JsonToken.START_ARRAY ) at [Source: (PushbackInputStream); line: 47, column

    2024年02月15日
    浏览(50)
  • Mybaits:数据库查询类型不匹配,java.sql.SQLDataException: Cannot determine value type from string

    目录 一.问题描述 二.源码分析 三.总结 事情的起因是用MybaitsPlus查询数据库过程中,查询结果与要封装的实体类字段类型对应不上,类似这样: 数据库查询结果: java实体类: 字段名字和实体类的名字类型都能对应上,但最后的查询结果却会报错java.sql.SQLDataException: Cannot d

    2024年02月03日
    浏览(64)
  • mysql报1292 Incorrect datetime value错误解决方法

    mysql插入、修改datetime类型的字段,报 Incorrect datetime value 的错误,sql语句如下: 如果去掉 +08:00 就可以插入。 试了网上说的查看并修改时区,都没用, 最后发现是 sql_mode导致的。 默认的sql_mode的值是 其中一个值是 STRICT_TRANS_TABLES ,这个选项会对日期时间类型的值进行严格的

    2024年02月07日
    浏览(59)
  • selenium执行报错:response = {‘status‘: 500, ‘value‘: ‘{“value“:{“data“:{“text“:“HTTP 错误 : 302Foun

    selenum的代码如下: 执行报错: python中selenium执行报错:response = {‘status‘: 500, ‘value‘: ‘{“value“:{“data“:{“text“:“HTTP 错误 : 302Found

    2024年02月14日
    浏览(88)
  • Spring Boot 升级 3.2 报错 Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String

    🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正! youlai-boot 升级 Spring Boot 3.2 版本项目启动报错: 报错截图如下: mybatis-spring 官方 ISSUE: https://githu

    2024年02月03日
    浏览(51)
  • curl执行请求报错Unexpected character (‘‘‘ (code 39)): expected a valid value

        在windows命令行里执行上述curl请求,执行报错,因为windows系统里不能识别单引号\\\',得换成双引号\\\",换成双引号后再执行,还是报错,这时还得把请求参数里的\\\"转义成\\\"。成功截图如下:   所以最终windows下能正确的执行curl命令为

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包