无法将阿拉伯字符插入oracle数据库

我在使用JDBC驱动程序从java中读取oracle中的阿拉伯字符时出现问题,主要问题是我找不到正确的字符编码来获取正确的数据,但我使用此方法手动解决了问题:

public static String cleanORCLString(String s) throws UnsupportedEncodingException { byte[] bytes = s.getBytes("UTF16"); String x = new String(bytes, "Cp1256"); String finalS = x.substring(3); StringBuilder sb = new StringBuilder(finalS); for(int k = sb.length() - 1 ; k > 0 ; k--) { if(!isEven(k)) { sb.deleteCharAt(k); } } return sb.toString(); } 

这个方法给我正确的字符,就像它在数据库中显示的那样,但是当我尝试更新/插入阿拉伯数据时,它会保存错误的字符。 例如:我的文本在数据库中保存为“?????????” 而不是“مرحبا”。

这是我连接到oracle数据库的方式。

 URL = ORCLConnProperties.ORCL_THIN_PREFIX + orclProp.getIpAddress() + orclProp.getPortNumber() + ORCLConnProperties.ORCL_THIN_SUFIX; // URL = jdbc:oracle:thin:@10.0.0.12:1521:ORCL System.out.println("URL: " + URL); Properties connectionProps = new Properties(); connectionProps.put("characterEncoding", "Cp1256"); connectionProps.put("useUnicode", "true"); connectionProps.put("user", orclProp.getUserName()); connectionProps.put("password", orclProp.getPassword()); try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException ex) { System.out.println("Error: unable to load driver class!"); System.exit(1); } myDriver = new oracle.jdbc.driver.OracleDriver(); DriverManager.registerDriver(myDriver); conn = DriverManager.getConnection(URL, connectionProps); 

请帮我解决这个问题? 谢谢。

新笔记:

数据库本身不使用UTF16字符集,但是

“JDBC OCI驱动程序将数据从服务器传输到数据库字符集中的客户端。根据NLS_LANG环境变量的值,驱动程序处理字符集转换:OCI将数据库字符集中的数据转换为UTF -8.JDBC OCI驱动程序然后将UTF-8数据传递到JDBC类库,其中UTF-8数据被转换为UTF-16。

这里提到了这个说明: http : //docs.oracle.com/cd/B10501_01/java.920/a96654/advanc.htm

首先,您可以使用SQL * PLUS命令检查数据库的NLS_CHARACTERSET参数: –

select * from v $ nls_parameters where parameter =’NLS_CHARACTERSET’;

结果应该是

参数

NLS_CHARACTERSET

AR8MSWIN1256

如果不是,则必须使用以下方法更改此参数的值: –

  • 点击键盘上的WINDOWS KEY + r

  • 写: – SQLPLUS sys as sysdba

  • 按Enter然后输入密码或只需按Enter键

  • 发出以下命令:

  • 立即关闭

  • 启动限制

  • ALTER DATABASE CHARACTER SET INTERNAL_USE AR8MSWIN1256;

  • ALTER DATABASE CHARACTER SET AR8MSWIN1256;

  • 立即关闭

  • 启动

  • 将NLS_LANG注册表字符串的值更改为AMERICAN_AMERICA.AR8MSWIN1256

    如果您的操作系统是UNIX使用的味道

AR8ISO8859P6代替AR8MSWIN1256作为NLS_CHARACTERSET的值

  • 除非您要在数据库中使用除(阿拉伯语和英语)之外的其他语言,否则请勿在数据库中使用National数据类型(即NVARCHAR,NTEXT或NCLOB)

  • AR8MSWIN1256字符集足以在同一领域内混合阿拉伯语和英语(据我所知)。

取自

检查你的oracle版本。 如果它老了它不能支持UTF16。

这是一篇文章 – 希望它会有用。

http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch6unicode.htm