Java 无法将阿拉伯语字符插入oracle数据库
我使用JDBC驱动程序在java中从oracle读取阿拉伯语字符时遇到问题,主要问题是我找不到正确的字符编码来获取正确的数据,但我使用以下方法手动解决了问题:Java 无法将阿拉伯语字符插入oracle数据库,java,oracle,jdbc,character-encoding,arabic,Java,Oracle,Jdbc,Character Encoding,Arabic,我使用JDBC驱动程序在java中从oracle读取阿拉伯语字符时遇到问题,主要问题是我找不到正确的字符编码来获取正确的数据,但我使用以下方法手动解决了问题: public static String cleanORCLString(String s) throws UnsupportedEncodingException { byte[] bytes = s.getBytes("UTF16"); String x = new String(bytes, "Cp1256");
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字符集,但
JDBCOCI驱动程序将数据从服务器传输到客户端
在数据库的字符集中。取决于
NLS_LANG环境变量,驱动程序处理字符集
转换:OCI将数据从数据库字符集转换为
UTF-8。然后,JDBC OCI驱动程序将UTF-8数据传递给JDBC
类库,其中UTF-8数据转换为UTF-16
此处提到了此注释:
检查您的oracle版本。如果它是旧的,它就不能支持UTF16 这里有一篇文章,希望对大家有用
首先,可以使用检查数据库的NLS_CHARACTERSET参数 SQL*PLUS命令:- 从v$nls_参数中选择*,其中参数='nls_CHARACTERSET' 结果应该是 参数 价值观 NLS_字符集 AR8MSWIN1256 如果不是,则必须使用以下方法更改此参数的值:- 按键盘上的WINDOWS键+r 写入:-SQLPLUS sys作为sysdba 按Enter键,然后输入密码,或者只需按另一个Enter键 发出以下命令: 立即关闭 启动限制 改变数据库字符集内部使用AR8MSWIN1256 ALTER数据库字符集AR8MSWIN1256 立即关闭 启动 将NLS_LANG注册表字符串的值更改为AMERICAN_AMERICA.AR8MSWIN1256 如果您的操作系统是UNIX的一种风格,请使用 AR8ISO8859P6代替AR8MSWIN1256作为NLS_字符集的值 不要在数据库中使用国家数据类型,如NVARCHAR、NTEXT或NCLOB,除非您打算在数据库中使用阿拉伯语和英语以外的其他语言 据我所知,AR8MSWIN1256字符集足以在同一字段中混合阿拉伯语和英语 取自
Oracle版本是11 G Enterprise Edition 11.1.0.7.0,我已经用这些数据从另一个程序中创建了表,正如我提到的,我可以通过将数据从UTF16转换为Cp1256来读取数据,但是我在插入和更新数据库时遇到了问题。我添加了一个新的注释,以使我的问题更加清楚,请检查是否可以@user3082691类路径上是否有orai18n.jar?不,我没有,我要试一下:谢谢你提供的信息和参考链接:非常感谢这是我问的一个老问题,但这是Solutionator数据库字符集。。。自Oracle 10g起不再支持。你不应该使用它,你可能会破坏你的数据库。遵循Oracle的官方指南:或使用