Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法将阿拉伯语字符插入oracle数据库_Java_Oracle_Jdbc_Character Encoding_Arabic - Fatal编程技术网

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");

我使用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字符集,但

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的官方指南:或使用