Java数据库中文乱码核心在于JDBC URL(useUnicode=true&characterEncoding=utf8)、MySQL服务端(character_set_server=utf8mb4)、JVM/IDE(file.encoding=UTF-8)三者统一,缺一不可。

Java 中数据库连接的字符编码配置,核心在于 JDBC URL 参数 + 数据库服务端设置 + 应用运行环境三者协同。只改一处往往无效,乱码问题多因链条断裂导致。
JDBC URL 必须显式声明编码参数
MySQL 的 JDBC 连接字符串中,useUnicode=true 和 characterEncoding=utf8(或 UTF-8)是基础组合,缺一不可:
- useUnicode=true:告诉驱动启用 Unicode 支持,否则 characterEncoding 不生效
-
characterEncoding=utf8:指定传输过程中的字节编码方式(注意:MySQL 实际认的是
utf8,不是UTF-8;虽然多数驱动兼容,但推荐写小写utf8) - MySQL 8.0+ 建议额外加上
serverTimezone=Asia/Shanghai,避免时区与编码耦合引发隐性乱码(如时间字段含中文注释时) - 完整示例:
jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
数据库服务端字符集要匹配
JDBC 参数只是客户端“怎么说”,服务端还得“听得懂”:
- 检查 MySQL 全局字符集:
SHOW VARIABLES LIKE 'character_set%'; - 关键项应为:
character_set_server=utf8mb4、collation_server=utf8mb4_0900_ai_ci(MySQL 8.0+ 推荐) - 建库建表时显式指定:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; - 若已有库表,可通过
ALTER DATABASE ... CHARACTER SET和ALTER TABLE ... CONVERT TO升级
JVM 与 IDE 编码必须统一为 UTF-8
即使数据库和 JDBC 都设对了,Java 自身用错编码仍会出乱码:
立即学习“Java免费学习笔记(深入)”;
- 编译阶段:Maven 项目需在
pom.xml中配置maven-compiler-plugin的encoding为UTF-8 - 运行阶段:JVM 启动参数必须加
-Dfile.encoding=UTF-8(Spring Boot 打 jar 包运行时尤其关键) - IDE 设置:IntelliJ 或 Eclipse 中,Global Encoding、Project Encoding、Properties Files Encoding 全部设为 UTF-8
- 验证方式:代码中打印
System.getProperty("file.encoding"),确保输出为UTF-8
连接池配置不替代 URL 编码参数
很多人误把连接池(如 HikariCP、Druid)的参数当成编码配置入口,其实不是:
- 连接池参数(如
maxPoolSize、connectionTimeout)控制连接生命周期,不参与字符编解码 - 字符编码只能通过 JDBC URL 传递给 MySQL 驱动,连接池只是复用这个已配置好的连接
- HikariCP 示例中,
config.setJdbcUrl("...?useUnicode=true&characterEncoding=utf8...")才是生效位置


















