不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
- (一)SQL state [99999]; error code [17056]; 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK; nested exception
- (二)java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
1、启动报错
java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
详细报错内容:
2、背景
使用 JDBC 连接Oracle数据库时出现报错。示例代码如下:
DataSourceConnectionUtils.java
package com.example.jdbctemplateproject.utils;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
/**
* 数据源连接工具
*
* @author: shipleyleo
* @create: 2023-04-07 17:32:16
*/
public class DataSourceConnectionUtils {
public static void jdbcTest(String url, String username, String password) throws ClassNotFoundException, SQLException {
//注册driver
Class.forName("oracle.jdbc.driver.OracleDriver");
//建立数据库连接对象
Connection conn = DriverManager.getConnection(url, username, password);
//建立操作对象
Statement stmt = conn.createStatement();
//结果集
ResultSet rs = stmt.executeQuery("select * from student");
while(rs.next()) { // 转换每行的返回值到 Map 中
System.out.println("id:" + rs.getLong("id") + ",name:" + rs.getString("name"));
}
//依次关闭结果集,操作对象,数据库对象
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
public static void main(String[] args) {
try {
jdbcTest("jdbc:oracle:thin:@localhost:1521:orcl", "system", "*********");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
下面是已添加的Oracle驱动包、支持字符集的依赖包。
pom.xml
<!-- Oracle 驱动包 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.5.0.0</version>
<scope>runtime</scope>
</dependency>
<!-- Additional library required to support Internationalization -->
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<version>21.5.0.0</version>
<scope>provided</scope>
</dependency>
3、原因分析
根据提示,报错是由于缺少字符集相关的 orai18n 依赖包所致。但是检查 pom.xml 文件,发现有配置 orai18n 依赖包。经排查测试,发现跟<scope>
标签内的取值有关。当 scope 取值为 provided、test (不支持运行期
)时,执行main方法会出现报错;当 scope 取值为 runtime、compile (支持运行期
)时,执行main方法不会出现报错。
4、解决方案
将 scope 的值改为 runtime 或者 compile(当然,也可以直接将 scope标签去掉,系统会默认选择compile)。如下所示:
pom.xml文章来源:https://www.toymoban.com/news/detail-708830.html
<!-- Additional library required to support Internationalization -->
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<version>21.5.0.0</version>
<scope>compile</scope>
</dependency>
参考资料文章来源地址https://www.toymoban.com/news/detail-708830.html
- maven 中 scope标签的作用(runtime、provided、test、compile 的作用)
到了这里,关于(二)java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!