Eclipse Maven Spring Boot项目JDBC读Oracle阿拉伯字符乱码问题
Oracle JDBC读取AR8MSWIN1256阿拉伯字符显示问号故障处理
问题基础信息
- 项目栈:Spring Boot + JDBC + Oracle 11G + JDK 8
- 库表字符集:AR8MSWIN1256(阿拉伯语Windows代码页字符集)
- 启动方式:执行
mvn clean package spring-boot:run启动 - 已尝试无效方案:配置JVM参数
-Dfile.encoding、修改Eclipse STS工作区编码为UTF-8/UTF-16 - 故障表现:查询返回的阿拉伯字段全部输出为问号
关联代码
预编译插入语句
INSERT INTO <TABLE_NAME> VALUES (1,1,'ممرضة التشفير شفير شفير شف','R20');
查询语句
SELECT * FROM <TABLE_NAME> WHERE ID=?;
结果遍历打印代码
ResultSet rs = pstmt.executeQuery(); String resultStrId = null; while (rs.next()) { resultStrId = rs.getString(1); System.out.println(resultStrId); System.out.println(rs.getString(2)); break; } rs.close();
输出对比
当前实际输出
Success from preparedStatement prepare for version 19.6.0.0 ????? ??????? ???? ???? ??
预期输出
ممرضة التشفير شفير شفير شف
备注:提问者不掌握阿拉伯语。
修复步骤
- 修正JDBC连接串配置
AR8MSWIN1256在Java侧对应的字符集名称是CP1256,直接在Spring Boot数据源连接URL中添加JDBC驱动级字符集参数,不要依赖全局JVM编码配置:
其中# application.properties 配置示例 spring.datasource.url=jdbc:oracle:thin:@//<数据库IP>:1521/<服务名>?oracle.jdbc.defaultNChar=true&characterEncoding=CP1256oracle.jdbc.defaultNChar=true强制JDBC驱动对所有字符串类型字段走国家字符集转码通道,避免驱动默认按ISO-8859-1转码丢失阿拉伯字符。 - 修正预编译语句传参方式
不要直接把阿拉伯字符串硬编码拼接到SQL语句中,所有字符串参数统一用?占位,通过PreparedStatement.setString()方法传入,避免SQL解析阶段的编码转义错误。 - 修正Maven启动的JVM编码配置
在pom.xml中给spring-boot-maven-plugin插件显式指定JVM编码参数,避免mvn启动时继承系统默认编码:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments> </configuration> </plugin> - 控制台编码适配
Windows环境启动前先在命令行执行chcp 65001切换控制台为UTF-8代码页;STS/Eclipse中除了工作区编码,还要在对应启动配置的VM参数中追加-Dfile.encoding=UTF-8,保证控制台打印时不会二次转码成问号。 - 数据库端配置校验
登录Oracle执行以下SQL确认库字符集配置正确,避免建库时字符集配置和预期不符:
正常返回值应为SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';AR8MSWIN1256。
内容的提问来源于stack exchange,提问作者Amit Mahajan
相关产品推荐
相关产品推荐

