数据库字符集配置是Java应用连接的前置前提:Oracle须为AL32UTF8、MySQL须为utf8mb4、SQL Server须为Chinese_PRC_CI_AS;Oracle JDBC忽略URL中characterEncoding参数,需通过JVM参数-Dfile.encoding=UTF-8和-Doracle.jdbc.defaultNChar=true配置,MySQL则必须在URL中同时指定useUnicode=true和characterEncoding=UTF-8。

确认数据库服务端字符集是前提
Oracle 用 AL32UTF8,MySQL 用 utf8mb4,SQL Server 用 Chinese_PRC_CI_AS 等——这些不是可选项,而是必须先查清的底座。执行以下语句验证:
- Oracle:
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET'; - MySQL:
SHOW VARIABLES LIKE 'character_set_database'; - SQL Server:
SELECT DATABASEPROPERTYEX('your_db', 'Collation');
如果返回的是 US7ASCII、latin1 或不支持中文的字符集,JDBC 配什么都没用,得先改库或重建库。
Oracle JDBC 连接不认 characterEncoding 参数
这是最容易踩的坑:Oracle 官方驱动(ojdbc8.jar 及以上)**完全忽略 URL 中的 characterEncoding=UTF-8 或 useUnicode=true**。加了不仅无效,还可能触发警告日志。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 正确做法是:URL 保持干净,例如
jdbc:oracle:thin:@//host:1521/orclpdb - 必须添加 JVM 启动参数:
-Dfile.encoding=UTF-8 -Doracle.jdbc.defaultNChar=true - 连接池(如 HikariCP)中建议配置:
connection-init-sql=ALTER SESSION SET NLS_LANGUAGE='AMERICAN' NLS_TERRITORY='AMERICA'
MySQL JDBC 必须显式声明编码参数
MySQL 驱动(mysql-connector-j 8.0+)依赖 URL 参数协商字符集,不设就默认用平台编码(Windows 常为 GBK,Linux 常为 UTF-8),极易错位。
- JDBC URL 示例:
jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai -
useUnicode=true和characterEncoding=UTF-8必须同时出现,缺一不可 - 注意:
&是 XML/HTML 转义写法,实际配置中不能写成&(会解析失败)
通用加固措施不能少
无论哪种数据库,Java 层的编码环境必须统一,否则 ResultSet.getString()、PreparedStatement.setString() 等操作仍会出问题。
- 启动时强制 JVM 使用 UTF-8:
-Dfile.encoding=UTF-8(推荐加在 java 命令或 application.yml 的 jvm-options 中) - 代码中避免隐式编码转换:不用
new String(bytes),改用new String(bytes, StandardCharsets.UTF_8) - 读写文件时明确指定编码:
Files.readAllLines(path, StandardCharsets.UTF_8) - Web 应用加过滤器,统一 request/response 编码为 UTF-8
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










