我在使用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
答案 0 :(得分:0)
检查你的oracle版本。如果它老了它不能支持UTF16。
这是一篇文章 - 希望它有用。
http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch6unicode.htm
答案 1 :(得分:-1)
首先,您可以使用检查数据库的NLS_CHARACTERSET参数 SQL * PLUS命令: -
从v $ nls_parameters中选择*,其中参数=' NLS_CHARACTERSET';
结果应该是
PARAMETER
VALUE
NLS_CHARACTERSET
AR8MSWIN1256
如果不是,则必须使用以下方法更改此参数的值: -
点击键盘上的WINDOWS KEY + r
写: - SQLPLUS sys as sysdba
按Enter然后输入密码或只需按另一个Enter
发出以下命令:
立即关闭
STARTUP RESTRICT
ALTER DATABASE CHARACTER SET INTERNAL_USE AR8MSWIN1256;
ALTER DATABASE CHARACTER SET AR8MSWIN1256;
立即关闭
STARTUP
将NLS_LANG注册表字符串的值更改为AMERICAN_AMERICA.AR8MSWIN1256
如果您的操作系统是UNIX的风格 使用
AR8ISO8859P6 而不是 AR8MSWIN1256 作为 NLS_CHARACTERSET
的值除非您要在数据库中使用其他语言(阿拉伯语和英语),否则不要在数据库中使用National数据类型(即NVARCHAR,NTEXT或NCLOB)
AR8MSWIN1256字符集足以将阿拉伯语和英语混合在同一个字段内(据我所知)。
采取