MySQL Connector/J 8.0.29插入UTF-8字符串报值不正确异常
问题现象
Java SpringBoot应用使用MySQL Connector/J 8.0.29版本向MySQL数据库插入UTF-8字符串时抛出异常,将驱动版本降级为8.0.27后问题不再复现。
环境说明
- 服务端:MySQL 8.0.29,操作系统为Windows10,直接在服务端执行UTF-8编码的INSERT SQL语句可正常运行,无异常
- 客户端:操作系统为Windows11,仅在客户端通过SpringBoot发送INSERT SQL语句时触发问题
参考信息
- 表结构参考:

- 核心错误日志:
Caused by: java.sql.SQLException: Incorrect string value: '\x95|\x82\xA2\x98b' for column 'path' at row 1 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
- 当前数据库连接配置:
spring.datasource.url=jdbc:mysql://localhost/${xpac.sql-database-name}?serverTimezone=Asia/Tokyo
- 异常对应关系:待插入内容「怖い話」,与报错日志中记录的异常字符序列
\x95|\x82\xA2\x98b完全对应(该序列为「怖い話」的Shift-JIS编码值)
问题根因
MySQL Connector/J从8.0.28版本开始调整了默认字符集检测逻辑:如果连接URL中未显式指定characterEncoding参数,驱动会自动读取客户端操作系统的默认编码作为连接字符集,不再沿用之前版本默认使用UTF-8的逻辑。
本次报错中,客户端系统默认编码为Shift-JIS,驱动以Shift-JIS编码发送字符串,但数据库对应字段使用UTF-8/utf8mb4字符集,编码不匹配导致抛出字符串格式错误。
解决方案
- 永久修复方案:在JDBC连接URL中显式指定字符集为utf8mb4,修改后的连接配置如下:
spring.datasource.url=jdbc:mysql://localhost/${xpac.sql-database-name}?serverTimezone=Asia/Tokyo&characterEncoding=utf8mb4
- 临时规避方案:将MySQL Connector/J版本回退至8.0.27,该方案不建议长期使用,显式指定连接参数可以避免后续版本升级带来的默认行为变更问题
- 配套检查项:确认数据库实例、业务表、
path字段的字符集均设置为utf8mb4,从服务端侧排除字符集配置隐患
内容的提问来源于stack exchange,提问作者francissoria
相关产品推荐
相关产品推荐

