大家好呀,我是summo,这次的文章标题是一个Mysql数据库的SQL错误,遇到的同学自然懂,没遇到的同学希望你永远也不要遇到。

一、错误说明

Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xA6' for column 'name' at row 1这个错误通常是由于数据库列的字符集设置不支持某些特殊字符(例如表情符号),导致在插入或更新数据时失败。根源就是MySQL使用的是utf8编码,utf8编码默认每个字符3个字节,而Emoji表情使用的Unicode编码占4个字节,所以写入数据库的时候会写入失败并报错。

二、错误分析

1. 分析表的字符集

有设计表结构经验的同学应该都知道MySQL的存储引擎,如InnoDB和MyISAM,但表的字符集不知道大家清不清楚。简单来说表的字符集(Character Set)决定了表中可以存储的字符类型及其编码方式。最适合存储表情符号的字符集是utf8mb4 ,所以遇到这个错误时首先检查一下错误表的字符集。

(1)查看 MySQL 的系统变量,以确认 MySQL 实例的默认字符集

SHOW VARIABLES LIKE 'character_set%';

(2)查看表的创建语句,从中可以看到表和列的字符集设置信息

SHOW CREATE TABLE sample_table;

如果检查后数据库字符集和表字符集都是utf8mb4,但是添加表情符号还是失败的话,那么跟数据库就没有关系了。

2. 确认数据库连接配置是否支持utf8mb4

这一步也简单,就是确认spring.datasource.url中是否也包含 utf8mb4 配置,如果没有的话,就加上useUnicode=true&characterEncoding=utf8mb4,如:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=utf8mb4

网上搜索的文章大部分都是这两个解决思路,有些甚至会让你去看MySQL的配置,修改后重新启动MySQL,但最终可能却并不能解决这个问题。如果你确定字符集是对的,数据库连接配置也是对的,但报错还是存在,那么就在执行SQL之前执行一次set names utf8mb4语句。

3. set names utf8mb4怎么加?

(1)没有使用连接池

如果你没有使用连接池,那么在调用SQL之前,需要手动执行一次set names utf8mb4语句,如下:

conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
stmt.execute("SET NAMES utf8mb4");

(2)Druid连接池

使用Druid连接池的话,那么可以直接加一行配置就行了,如下:

spring.datasource.druid.connection-init-sqls=set names utf8mb4

(3)Hikari连接池

同Druid连接池,加一行配置就行了,如下:

spring.datasource.hikari.connection-init-sql=SET NAMES utf8mb4

其他连接池我就不列举了,大同小异。

三、原理解释

set names utf8mb4 通过确保客户端、连接和服务器之间的数据传输在同一字符集下进行,从根本上避免了字符集不匹配的问题,所以执行该命令能够解决你插入表情符号时报错的问题。

当你执行 set names utf8mb4 语句时,它实际上做了以下几件事情:

  • 设置客户端字符集:

    使MySQL客户端的字符集为utf8mb4,这意味着客户端(也就是你的应用程序)发送给MySQL服务器的数据将被解释为utf8mb4格式。

  • 设置连接字符集:

    使数据库连接层(也叫连接字符集)的编码为utf8mb4。这保证了当数据在客户端和服务器之间传输时,被正确地编码和处理。

  • 设置结果字符集:

    使MySQL服务器返回给客户端的查询结果(比如SELECT语句的结果)都使用utf8mb4编码。

四、小结一下

最初,我的记录方式更偏向简单的笔记,后来发现笔记太乱,为了提高查阅效率,我开始给每个部分加上标题和段落,这样它们就演变成了短文。随着时间的推移,我逐渐增加了内容的层次,加入了前因、详细的分析过程以及小结,这些改进使我的记录更加完善,最终变成了结构化的文章。

不过,在文章标题的选择上,我有些犹豫。尽管起一个吸引人的标题能让文章更有吸引力,但如果将来遇到类似的问题时,因为标题花哨、不明确而导致找不到解决方案,那就得不偿失了。

【BUG记录】Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xA6' for column 'name' at row 1的更多相关文章

  1. mysql 无法存储表情字符 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xBE",...' for column 'XXXX' at row 1

    1.变更字段类型 ALTER TABLE api_log MODIFY COLUMN remark longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_uni ...

  2. MySql中报错:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xBB' for column

    问题描述: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xBB' for column 'nickName' at row ...

  3. 表情存储异常--mybatis抛出异常(java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1)

    文章参考 https://blog.csdn.net/junsure2012/article/details/42171035 https://www.cnblogs.com/WangYunShuai ...

  4. java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1

    java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1 mysql报错 ...

  5. java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\xB3' for column 'Content' at row 1

    在尝试将 emoji 表情符号 插入MySQL数据库时,遇到以下错误信息: ### The error occurred while setting parameters ### SQL: INSER ...

  6. mybatis抛出异常(java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1)

    文章参考 https://blog.csdn.net/junsure2012/article/details/42171035 https://www.cnblogs.com/WangYunShuai ...

  7. 彻底解决:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1

    转载:https://blog.csdn.net/qq_31122833/article/details/83992085

  8. java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'name' at row 1

    我的错误案例: ,这个后台插不进去,就姓名那栏的中文编码问题. 遇到这个错误,应该是创建表的时候没有设置好编码,这个错误不用多想,我也试过在更改表那里设置编码,但还是不行,还是有残留 直接drop t ...

  9. 【MySQL】java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\xB3' for column

    问题原因: 输入内容包含特殊字符,MySQL 中的列不支持. 解决方法 多数是修改 MySQL 的数据库和表结构,CHARSET 改为 utf8mb4,但本人测试还是不能传入 emoji. 后来在代码 ...

  10. java.sql.SQLException: Incorrect string value: '\xF0\x9F\x9A\x80\xF0\x9F...' for column 'name' at row 1

    1.异常提示: 12:59:10.000 [http-nio-8080-exec-40] DEBUG o.s.j.s.SQLStateSQLExceptionTranslator - Extracte ...

随机推荐

  1. k8s安全---安全机制之RBAC授权(14)

    一.k8s 安全管理:认证.授权.准入控制概述 k8s 对我们整个系统的认证,授权,访问控制做了精密的设置:对于 k8s 集群来说,apiserver 是整 个集群访问控制的唯一入口,我们在 k8s ...

  2. vue3 快速入门系列 —— 状态管理 pinia

    其他章节请看: vue3 快速入门 系列 pinia vue3 状态管理这里选择 pinia. 虽然 vuex4 已支持 Vue 3 的 Composition API,但是 vue3 官网推荐新的应 ...

  3. 009_原理图中电气互连,Net alias,分页符,总线

    009_原理图中电气互连,Net alias,分页符,总线 1.电气互连,就是画线. 2.端口名,适用同一页相连的端口. 3.分页符off page connector,适用于不同页的端口连接. 4. ...

  4. C#的基于.net framework的Dll模块编程(五) - 编程手把手系列文章

    这次继续这个系列的介绍: 一.使用DLL类库的方法: 1) 静态类: 先引用该类库,然后声明命名空间,然后就能够进行使用了. 2) 动态类: 先引用该类库,然后声明命名空间,然后能够进行使用了. 3) ...

  5. 【爬虫+数据清洗+可视化分析】Python舆情分析哔哩哔哩"狂飙"的评论

    目录 一.背景介绍 二.爬虫代码 2.1 展示爬取结果 2.2 爬虫代码讲解 三.可视化代码 3.1 读取数据 3.2 数据清洗 3.3 可视化 3.3.1 IP属地分析-柱形图 3.3.2 评论时间 ...

  6. FE知识点(硕哥)

    目录 前传: 1.typeof和类型转换 正文: 1.作用域.作用域链([[scope]]) 2.立即执行函数 3.闭包 4.对象.包装类 5.原型原型链 6.call.apply 7.继承模式.命名 ...

  7. C数据结构线性表:最全链表实战剖析—单 双 循环链表&增删改查

    文章目录 前言 说明1 说明2 A:关于为什么传链表要用二级指针 B:单链表 1:定义结构体 2:初始化链表 3:销毁链表内容 (释放整个链表空间,把L指针赋值为NULL ) 4:增加某一个位置上的元 ...

  8. 2020版IDEA配置Tomcat 10出现卡主问题

    问题描述 配置了2020版的IDE和Tomcat,但是产生了,日志打印中途,卡住了的问题,如图: 18-Aug-2021 00:46:09.763 信息 [main] org.apache.catal ...

  9. 微软正式发布:.NET Aspire 云原生开发框架

    前言 2024年5月22日北京时间,微软正式发布全新的.NET云原生开发框架-.NET Aspire. .NET Aspire 是一个新的平台无关.语言无关的框架,旨在简化 .NET云原生服务的开发, ...

  10. 从零开始写 Docker(十五)---实现 mydocker run -e 支持环境变量传递

    本文为从零开始写 Docker 系列第十五篇,实现 mydocker run -e, 支持在启动容器时指定环境变量,让容器内运行的程序可以使用外部传递的环境变量. 完整代码见:https://gith ...