核心是java客户端、数据库服务器、数据表三者字符集必须对齐;需统一jdbc连接参数、服务端字符集、应用层编码,并按客户端→jdbc→框架顺序逐段验证。

核心是让 Java 客户端、数据库服务器、数据表三者字符集对齐,不能只改一端。达梦(DM)、MySQL、Oracle 等虽语法略有差异,但解决逻辑一致。
明确 JDBC 连接参数中的字符集
这是最直接有效的客户端控制方式。在连接 URL 中强制指定编码,覆盖默认行为:
- 达梦 DM:用 characterEncoding=UTF-8(或 GBK),如:
jdbc:dm://127.0.0.1:5236/TEST?characterEncoding=UTF-8 - MySQL:必须同时启用 Unicode 支持:
jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8 - Oracle:通常依赖 NLS_LANG 环境变量,但 JDBC URL 可加 ?useUnicode=true&characterEncoding=UTF-8 做补充
确认并统一数据库服务端字符集
连接参数只是“告诉数据库我用什么编码”,如果数据库本身不支持或不是该编码,仍会出问题:
- 达梦:查当前字符集:
SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
建库时应指定 UTF8;运行中修改需谨慎,建议重建库 - MySQL:执行 SHOW VARIABLES LIKE 'character_set%';
关键项如 character_set_server、collation_server 应为 utf8mb4 - 创建库/表时显式声明:
CREATE DATABASE mydb DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
检查应用层与中间件的隐含编码
即使连接和库都设对了,乱码还可能来自其他环节:
- JVM 启动参数未统一:添加 -Dfile.encoding=UTF-8,避免 FileReader / System.out 等默认走系统编码
- IDE 编码设置(IntelliJ/Eclipse):确保项目文件编码、控制台编码均为 UTF-8
- Spring Boot 项目:在 application.yml 中配置:
server.servlet.encoding.charset: UTF-8
server.servlet.encoding.force: true - Tomcat:在 conf/server.xml 的 Connector 中加 URIEncoding="UTF-8"
验证与排查顺序
按链路从外到内逐段验证,避免凭空猜测:
- 先用数据库客户端(如 DBeaver、DM Manager)连上,手动插入/查询中文,确认库本身能存取正常
- 再写最小 Java 程序(仅 DriverManager + executeQuery),绕过框架,验证 JDBC 层是否正常
- 最后加入 Spring、MyBatis 等框架,检查其配置是否覆盖或干扰了编码设置
- 抓包观察实际 SQL 字节流(如用 Wireshark 或 JDBC 日志),确认发送到数据库的确实是 UTF-8 字节
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











