💥 解决 ORA-17056:不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
在使用 Java 调用 Oracle 数据库 时,有时会遇到以下异常:
java.sql.SQLException: ORA-17056: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
🧩 一、问题原因
Oracle 数据库支持多种字符集,比如常见的:
AL32UTF8(UTF-8)ZHS16GBK(简体中文 GBK)ZHT16BIG5(繁体中文 BIG5)
当数据库使用了 ZHS16GBK 这样的中文字符集时,
Java 程序通过 Oracle JDBC 驱动(如 ojdbc8.jar) 访问数据库时,
如果驱动中 没有包含中文字符集支持类,就会抛出这个异常。
🧠 二、核心原因
Oracle 的字符集支持被拆分到独立的国际化包中:
✅
orai18n.jar(即 Oracle Internationalization Library)
JDBC 驱动(ojdbc8.jar)默认不包含中文字符集定义,
所以当数据库返回 ZHS16GBK 编码的数据时,驱动无法识别。
⚙️ 三、解决方案
解决方法非常简单:
为你的 ojdbc 版本添加匹配的 orai18n.jar 依赖。
✅ 1. 确认当前使用的 JDBC 版本
打开 pom.xml,查看 Oracle JDBC 驱动配置:
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>23.2.0.0</version>
</dependency>
这里可以看到版本号是 23.2.0.0。
✅ 2. 添加对应版本的国际化包(orai18n.jar)
orai18n.jar 必须与 ojdbc 版本完全一致!
在上面的示例中,需要添加:
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<version>23.2.0.0</version>
</dependency>
Maven 会自动下载并加入 classpath,
如果你是手动部署 jar,请确保它与应用一起打包或位于 BOOT-INF/lib/(Spring Boot 项目)中。
✅ 3. 清理并重新启动项目
执行以下命令重新构建:
mvn clean package
然后启动项目。
若启动时日志中不再出现 Non supported character set: ZHS16GBK,说明问题已解决。
🧾 四、示例完整依赖配置
<dependencies>
<!-- Oracle JDBC 驱动 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>23.2.0.0</version>
</dependency>
<!-- Oracle 国际化字符集支持 -->
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<version>23.2.0.0</version>
</dependency>
</dependencies>
✅ 五、适配其他版本说明
| JDBC 驱动 | orai18n 版本 | 说明 |
|---|---|---|
| ojdbc8 19.3.0.0 | orai18n 19.3.0.0 | Oracle 19c 官方推荐组合 |
| ojdbc8 21.1.0.0 | orai18n 21.1.0.0 | 适用于 Oracle 21c |
| ojdbc8 23.2.0.0 | orai18n 23.2.0.0 | 最新版本(支持 JDK17+) |
🧩 六、补充:如何确认数据库字符集
如果你不确定数据库的字符集,可以在 SQL*Plus 或任何 SQL 工具中执行:
SELECT userenv('language') FROM dual;
结果示例:
AMERICAN_AMERICA.ZHS16GBK
这表示数据库使用了 ZHS16GBK 字符集。
🚀 七、总结
| 问题 | 原因 | 解决方案 |
|---|---|---|
| ORA-17056: 不支持的字符集 | JDBC 驱动不包含中文字符集支持 | 添加 orai18n.jar |
| orai18n 版本不匹配 | 不同版本的 JDBC 与 NLS 包不兼容 | 版本号必须一致 |
| JAR 未被加载 | 未打包进 classpath | 确保位于运行时 classpath 或 BOOT-INF/lib |
💡 参考链接
✅ 总结一句话:
出现 “不支持的字符集:ZHS16GBK” 的根本原因,是 缺少或版本不匹配的
orai18n.jar。 只要为你的ojdbc8添加匹配版本的orai18n依赖,即可完美解决。
