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
相关产品推荐
相关产品推荐

