You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java查询Oracle 11g阿拉伯语varchar2字段返回问号乱码如何解决

Oracle 11g 阿拉伯语VARCHAR2列查询乱码解决方案

1 首先修正JDBC连接配置

你当前连接串后追加的useUnicode=yes&characterEncoding=AL16UTF16是MySQL驱动的配置参数,Oracle Thin驱动完全不识别这两个参数,额外追加反而可能引发编码转换异常,直接删除这部分参数即可,Oracle JDBC驱动会自动根据数据库端字符集完成适配转换:

// 修正后的连接创建代码
con = DriverManager.getConnection(DB_URL, DB_USERNAME,DB_PASSWORD);

同时注意不要使用sys用户操作业务表,建议切换为业务专属普通用户,避免权限类异常干扰。

2 排查数据库端字符集配置

首先在数据库端执行以下SQL,确认数据库字符集是否支持阿拉伯语:

SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
  • 如果返回的NLS_CHARACTERSET值为US7ASCII、WE8ISO8859P1等不支持阿拉伯语的字符集,说明数据写入时就已经被转成问号存储,读取端无法修复,需要修改数据库字符集为AL32UTF8(通用多字节)或AR8MSWIN1256(阿拉伯语专属)后重新写入数据。
  • 如果NLS_CHARACTERSET为AL32UTF8或AR8MSWIN1256,继续下一步排查。

3 确认数据存储本身有效性

使用Oracle官方客户端(如SQL Developer)直接连接数据库,执行以下查询:

SELECT EMP_NAME FROM person_data WHERE emp_name LIKE N'اسامة محمد عبدالله توحيد احمد';

如果查询结果还是显示问号,说明数据写入环节就存在编码错误,需要优先修复写入逻辑,再调整读取逻辑。

4 修正读取代码逻辑

  • 你当前的字段是VARCHAR2类型,getNString()仅适用于NVARCHAR2类型字段,无需调用。
  • 如果数据库字符集为AL32UTF8,直接调用rs.getString("EMP_NAME")即可拿到正常文本,不需要额外转码。
  • 如果数据库字符集为AR8MSWIN1256,才需要用以下方式转码:
byte[] tmp = rs.getBytes("EMP_NAME");
String emp_name = new String(tmp, "Windows-1256");

内容的提问来源于stack exchange,提问作者Ashiqur Rahman Abir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:15:02