当前位置: 首页 > 面试题库 >

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

柳昊焱
2023-03-14
问题内容

使用JDBC驱动程序从Java中的oracle中读取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参数:

从v $ nls_parameters中选择*,其中parameter =’NLS_CHARACTERSET’;

结果应该是

参数

NLS_CHARACTERSET

AR8MSWIN1256

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

  • 在键盘上按WINDOWS KEY + r

  • 写:-SQLPLUS sys作为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 的值 *

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

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



 类似资料:
  • 我正面临着从Oracle数据库12c获取阿拉伯语内容的问题,我已经回答了大多数问题,但没有任何问题与我一起工作。 我的阿拉伯字符返回如下“?????” 即使在java上,当我获得数据时,它也不会返回阿拉伯值 windows 10笔记本电脑(使用windows 10管理用户登录) Oracle 12C(使用系统用户登录) Java版本“1.8.0_152” 我在这里和网上找到了很多问题,比如: 无法

  • 问题内容: 我正在帮助我的一位朋友。他正在使用JSF 2.0和mysql创建Web应用程序。 在创建数据库时,他使用了以下查询。 截止日期网站运行良好。今天,客户尝试输入阿拉伯文字,他们说输出结果很奇怪。我朋友做的是在将数据输入到DB之后,他还在另一页上打印了相同的数据。但是他认为输出为。我不明白为什么正确设置数据库字符后他会得到这样的信息。 web.xml的 内容如下。 在每个 .xhtml 页

  • 问题内容: 我有一个Java应用程序,想要将阿拉伯语单词插入mysql数据库,我的代码看起来像 但是它只插入’??????’。我现在能做什么? 问题答案: 在db变量声明后添加此变量: 然后修改您的行: 至

  • 问题内容: $test = json_encode(‘بسم الله’); echo $test; 作为此代码的结果,输出为:虽然它应该类似于“بسمالله”。阿拉伯字符是通过JSON编码而编码的,而在Youtube API上则不是这样:http : //gdata.youtube.com/feeds/api/videos/RqMxTnTZeNE?v=2&alt=json 您可以在YouTub

  • 事情是这样的 我不知道发生了什么,如果有人能帮忙,我会非常感激的。THX!

  • 我正在尝试使用最新的雅虎天气apihttps://weather-ydn-yql.media.yahoo.com/forecastrss它工作得很好,但当我设置语言(lang=ar AE)时,它返回带问号的json响应,而不是阿拉伯字符。例如“城市”:“城市”对于英语来说,这是可以的。 我没看到留档里有关于utf设置的东西 当我打开雅虎的天气页面https://www.yahoo.com/news