首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL 写不进去数据,程序报错,谁的问题?

MySQL 写不进去数据,程序报错,谁的问题?

作者头像
AustinDatabases
发布2026-07-23 13:30:00
发布2026-07-23 13:30:00
550
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

MySQL写不进去数据,最近部署了一个匪夷所思的项目,外包开发的,那是一点都不靠谱。好像用了一个特别老的Mybatis这个JAVA的矿建里面的 JDBC连接串中的characterEncoding=utf8是写死的,开发改成utf8mb4,直接就报错,说不支持。

MySQL这边(兼容mysql的产品也是一样,包含polardb for mysql),在建库,建表的时候我们都是按照 utf8mb4建立的表和库,但是在应用程序写入数据的时候,一些文字里面有笑脸,或者特殊的标记,这样的应用直接报错,说写入不了数据库。这主要还是MySQL驱动的问题,在传输数据的时候,而不是写到数据库的时候,就直接拦截了emoji 或者生僻字。

代码语言:javascript
复制
java.sql.SQLException: Incorrect string value

因为这个事情我们之前也是没有遇到,不过最后解决了,那么我们看看有几种解决方案。

解决方案 1

虽然全局的链接我们改不了,但我们可以在每次建立数据链接后,直接修改当前链接的字符集,比如每次在插入数据的时候,先执行一条 set names utf8mb4;

解决方案2

在数据源的配置中,让连接池自己在创建链接的时候,自动初始化语句。

代码语言:javascript
复制
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init">
  <property name="connectionInitSqls">
      <list>
          <value>SET NAMES utf8mb4</value>
      </list>
  </property>
</bean>

解决方案3

在JAVA代码层进行Base64的编码,将含有Emoji的文本编码后在写入到 varchar 读取在解码。

当然这个非常不适合遇到如我这次紧急发现问题还要当天上线的情况。

解决方案4 这个回到怎么的本行,数据库,数据库mysql里面可以进行调整配置,解决问题

在 MySQL 中,字符集配置不仅仅是一个“显示层”的问题,而是直接决定了数据存储、传输和比较的方式。在我们遇到乱码、插入失败、排序异常,其根源往往就是客户端和服务端的字符集不一致。

我们需要修改以下的参数或校准参数重启数据库后,问题解决。首先character-set-server = utf8mb4 这个一定要改,改完数据库需要重启,这个的目的就是让MYSQL默认使用utf-8的四个字节的扩展版本UTF8MB4.

同时对应的collation-sever也需要改变,统一到collation-server = utf8mb4_general_ci,这是排序规则,他决定了字符串比较时的大小写敏感的问题和语言本身的特性。更复杂的排序会在进行字符排序的时候,查询性能变差。

同时我们还要注意一个配置 character-set-client-handshake = FALSE

这个配置可以强制MYSQL 拒绝听从客户的字符集握手的请求,而是将服务器端的配置UTF8MB4强制给客户。

最后最后,字符集的变动是一件大事,不光影响你的字符集写入的问题,还影响你的数据磁盘空间占用和内存的占用的问题,对吗!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档