Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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 12c上插入/检索阿拉伯语数据_Java_Oracle_Arabic_Oracle12c - Fatal编程技术网

Java 在Oracle 12c上插入/检索阿拉伯语数据

Java 在Oracle 12c上插入/检索阿拉伯语数据,java,oracle,arabic,oracle12c,Java,Oracle,Arabic,Oracle12c,我面临着从Oracle数据库12c获取阿拉伯语内容的问题,我已经回答了大多数问题,但没有任何东西对我起作用 我的阿拉伯文字符是这样返回的 即使在java上,当我获取数据时,它也不会返回阿拉伯语值 { "employees":[ { "fname":"????", "lname":"Saleh", "amount":30000, "phone":"96600000097" }, {

我面临着从Oracle数据库12c获取阿拉伯语内容的问题,我已经回答了大多数问题,但没有任何东西对我起作用

我的阿拉伯文字符是这样返回的

即使在java上,当我获取数据时,它也不会返回阿拉伯语值

{
   "employees":[
      {
         "fname":"????",
         "lname":"Saleh",
         "amount":30000,
         "phone":"96600000097"
      },
      {
         "fname":"Saleh",
         "lname":"Salem",
         "amount":40000,
         "phone":"96600000097"
      },
      {
         "fname":"Hasan",
         "lname":"Damis",
         "amount":25000,
         "phone":"96600000097"
      },
      {
         "fname":"Ahmad",
         "lname":"?????",
         "amount":25000,
         "phone":"96600000097"
      },
      {
         "fname":"Abbas",
         "lname":"Motwali",
         "amount":20000,
         "phone":"96600000097"
      }
   ]
}
当我使用SQLDeveloper时,我可以选择插入阿拉伯语值

我在笔记本电脑上使用oracle学习:

使用Windows 10管理员用户登录Windows 10笔记本电脑 Oracle 12c已使用系统用户登录 java版本1.8.0_152 我在这里和互联网上发现了很多问题,比如:

但不幸的是,我不能在sqlplus上使用此命令

SHUTDOWN IMMEDIATE
它返回此错误消息

ORA-01031:权限不足

我在网上找到了这个答案

但不幸的是,我没有本地用户和组部分,我认为它只在WindowsNT或服务器上

另外,互联网上的一个答案建议在系统注册表中添加NLS_LANG,并为阿拉伯语Unicode指定值AR8MSWIN1256,实际上有不同的值

不幸的是,我面临另一个问题

ORA-12505,TNS:侦听器目前不知道连接描述符中给出的SID

在sql plus上,我得到以下错误:

我遵循了这个答案,但它没有连接到我的数据库

但它一直给我同样的问题

因此,我将创建NLS_LANG的注册表项重命名为不同的名称,这是我唯一真正更改的内容,以恢复所有内容 数据库再次运行

所以我的问题是:

如何以阿拉伯语值插入和选择数据?我不知道Oracle、Java或SQLPLUS的问题出在哪里! 更新1:我的Java代码:

**OracleDBConnect2类:**

包com.oracle.testconnect

导入java.io.BufferedReader; 导入java.io.File; 导入java.io.FileOutputStream; 导入java.io.InputStreamReader; 导入java.io.PrintWriter; 导入java.sql.Connection; 导入java.sql.DriverManager; 导入java.sql.ResultSet; 导入java.sql.Statement; 导入java.text.simpleDataFormat; 导入java.util.ArrayList; 导入java.util.Calendar; 导入java.util.Date; 导入java.util.HashMap; 导入java.util.Map

导入org.json.JSONArray; 导入org.json.JSONObject

公共类OracleDBConnect2{ 静态PrintWriter logPrintWriter

public static void main(String args[]) {
    System.setProperty("file.encoding", "UTF-8");

    JSONObject jsonObj = new JSONObject();
    JSONArray jsonArray = new JSONArray();      // getting current datetime

    try {
        // create the connection object
        Connection dbConnection = DriverManager
                .getConnection(
                        "jdbc:oracle:thin:@url:port:DBName",
                        "username", "password");

        // create the statement object
        Statement sqlStatement = dbConnection.createStatement();

        // execute query
        String query = "select * from employee";
        ResultSet results = sqlStatement.executeQuery(query);

        // Convert result to json array
        jsonArray = Convertor.convertToJSON(results);
        System.out.println("jsonArray " + jsonArray.toString());


        // Add JSON Array results to employee JSON Object
        jsonObj.put("employees", jsonArray);


        // Getting the output stream of the file for writing
        File file = new File(Constants.JSON_FILE_PATH);
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        PrintWriter printWriter = new PrintWriter(fileOutputStream);
        if (!file.exists()) {
            file.mkdirs();
            file.createNewFile();
        }

        // Writing the user input to the file
        printWriter.write(jsonObj.toString());
        printWriter.flush();
        fileOutputStream.close();
        printWriter.close();

        // close the connection object
        dbConnection.close();

    } catch (Exception e) {
        System.out.println(e);
    }

}
}

**转换器类别:**

公共类转换器{

public static JSONArray convertToJSON(ResultSet resultSet) throws Exception {
    JSONArray jsonArray = new JSONArray();
    while (resultSet.next()) {
        int total_rows = resultSet.getMetaData().getColumnCount();
        JSONObject obj = new JSONObject();
        for (int i = 0; i < total_rows; i++) {
            obj.put(resultSet.getMetaData().getColumnLabel(i + 1).toLowerCase(), resultSet.getObject(i + 1));
        }
        jsonArray.put(obj);
        System.out.println(resultSet.getString(1));
    }
    return jsonArray;
}

正如我看到的,您的数据库可以接受阿拉伯语,正如您在SQLDeveloper示例中所示,所以问题在于java和sqlplus命令行

关于命令行,我认为问题在于使用的代码页

尝试使用chcp dos commnad更改代码页。我不知道任何阿拉伯语,但看看有一些选择。尝试chcp 720或chcp 1256或709或708,换言之,在页面上找到任何阿拉伯语,然后运行sqlplus命令。此外,也有可能无法按照@Vahadin的链接在dos中显示阿拉伯语

关于java,我认为您没有提供足够的信息—使用的源代码、编码是否使用utf-8?等等


希望这对您有所帮助,并且不会让您更加困惑。

因为我可以看到您的数据库可以接受阿拉伯语,正如您在sql developer示例中所示,所以问题在于java和sqlplus命令行

关于命令行,我认为问题在于使用的代码页

尝试使用chcp dos commnad更改代码页。我不知道任何阿拉伯语,但看看有一些选择。尝试chcp 720或chcp 1256或709或708,换言之,在页面上找到任何阿拉伯语,然后运行sqlplus命令。此外,也有可能无法按照@Vahadin的链接在dos中显示阿拉伯语

关于java,我认为您没有提供足够的信息—使用的源代码、编码是否使用utf-8?等等

希望这对您有所帮助—不要让您更加困惑。

首先,自Oracle 10g以来,ALTER DATABASE CHARACTER SET…已不受支持。您不应该使用它,您可能会破坏您的数据库。请遵循Oracle的官方指南:或使用

NLS_LANG的格式为language_territory.charset。AR8MSWIN1256不起作用,请使用带有点的AR8MSWIN1256。每个组件都是可选的,因此您可以跳过language和territory

SQLplus从命令行继承编码。如果使用chcp 28596,即ISO 8859-6 see,则NLS_LANG值中的字符集必须为。AR8ISO8859P6 see

如果您想使用NLS_LANG=.AR8MSWIN1256,那么在启动sqlplus之前必须运行chcp 1256

或者,如果您喜欢使用UTF-8,请按如下方式运行:

c:\> chcp 65001
c:\> set NLS_LANG=.AL32UTF8
c:\> sqlplus ...
注意,环境变量set NLS_LANG=.AL32UTF8优先于注册表设置

确保cmd.exe中使用的字体支持阿拉伯语字符。您可以使用此页面进行测试:

请检查以下答案:

关于Java,我可以 没有帮助,我不熟悉Java/JDBC。请记住,Java不使用NLS_LANG设置,请参阅首先ALTER DATABASE CHARACTER SET。。。自Oracle 10g起不再支持。你不应该使用它,你可能会破坏你的数据库。遵循Oracle的官方指南:或使用

NLS_LANG的格式为language_territory.charset。AR8MSWIN1256不工作,请使用带有点的.AR8MSWIN1256。每个组件都是可选的,因此您可以跳过语言和区域

SQLplus从命令行继承编码。如果使用chcp 28596,这意味着ISO 8859-6请参阅,则NLS_LANG值中的字符集必须为。AR8ISO8859P6请参阅

如果您想使用NLS_LANG=.AR8MSWIN1256,那么在启动sqlplus之前必须运行chcp 1256

或者,如果您喜欢使用UTF-8,请按如下方式运行:

c:\> chcp 65001
c:\> set NLS_LANG=.AL32UTF8
c:\> sqlplus ...
注意,环境变量set NLS_LANG=.AL32UTF8优先于注册表设置

确保cmd.exe中使用的字体支持阿拉伯语字符。您可以使用此页面进行测试:

请检查以下答案:


关于Java,我帮不了你,我不熟悉Java/JDBC。请记住,Java不使用NLS_LANG设置,请参见

我只想通过@Plirkee comment和@Wernfried Domscheit answer提供的附加注释来合并和改进答案

一,。解决CMD上的问题:

@Domscheit先生建议采取以下措施:

c:\> chcp 65001
c:\> set NLS_LANG=.AL32UTF8
c:\> sqlplus ...
// Getting the output stream of the file for writing
    File file = new File(Constants.JSON_FILE_PATH);
    FileOutputStream fileOutputStream = new FileOutputStream(file);
//  PrintWriter printWriter = new PrintWriter(fileOutputStream);  // old line 
// make sure that the stuff you are writing to the file is utf-8
    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8)); 
其中,如果您不想每次通过注册表添加前两个命令时都键入它们:

将代码页设置为65001: 按照本节中的说明:

开始->运行->重新编辑 转到[HKEY\U LOCAL\U MACHINE\Software\Microsoft\Command Processor] 添加名为“自动运行”的新字符串值 将该值更改为chcp 65001 接近

将NLS_LANG设置为.AL32UTF8

开始->运行->重新编辑 转到[HKEY\U LOCAL\U MACHINE\Software\Oracle\{OracleHome}] 添加名为NLS_LANG的新字符串值 将该值更改为.AL32UTF8 关 现在,当您打开CMD时,您可以找到活动的代码页:65001,您可以直接使用sqlplus

Microsoft Windows [Version 10.0.15063]
(c) 2017 Microsoft Corporation. All rights reserved.
Active code page: 65001

C:\Users\ahmed>sqlplus

SQL*Plus: Release 12.2.0.1.0 Production on Sat Dec 23 16:10:23 2017

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter user-name: system
Enter password:
Last Successful login time: Sat Dec 23 2017 15:58:21 +03:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> select * from employee;

FNAME      LNAME      PHONE            AMOUNT
---------- ---------- ------------ ----------
أ ح م د       Saleh      966000000001      30000
Saleh      Salem      966000000001      40000
ح س ن        Damis      966000000001      25000
Ahmad      Saleh      966000000001      25000
Abbas      Motwali    966000000001      20000

SQL>
二,。用Java显示阿拉伯语: @Plirkee先生建议采取以下措施:

c:\> chcp 65001
c:\> set NLS_LANG=.AL32UTF8
c:\> sqlplus ...
// Getting the output stream of the file for writing
    File file = new File(Constants.JSON_FILE_PATH);
    FileOutputStream fileOutputStream = new FileOutputStream(file);
//  PrintWriter printWriter = new PrintWriter(fileOutputStream);  // old line 
// make sure that the stuff you are writing to the file is utf-8
    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8)); 
这会解决问题吗?????将字符转换为未知内容,如ØØÙ…Ø 要解决此问题,除了Mr@Plirkee answer之外,请确保将IDE编码更改为UTF-8(假设您正在使用Eclips):

窗口->首选项->常规->工作区->文本文件编码

改为UTF-8

我只想通过@Plirkee comment和@Wernfried Domscheit answer提供的附加注释来合并和改进答案

一,。解决CMD上的问题:

@Domscheit先生建议采取以下措施:

c:\> chcp 65001
c:\> set NLS_LANG=.AL32UTF8
c:\> sqlplus ...
// Getting the output stream of the file for writing
    File file = new File(Constants.JSON_FILE_PATH);
    FileOutputStream fileOutputStream = new FileOutputStream(file);
//  PrintWriter printWriter = new PrintWriter(fileOutputStream);  // old line 
// make sure that the stuff you are writing to the file is utf-8
    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8)); 
其中,如果您不想每次通过注册表添加前两个命令时都键入它们:

将代码页设置为65001: 按照本节中的说明:

开始->运行->重新编辑 转到[HKEY\U LOCAL\U MACHINE\Software\Microsoft\Command Processor] 添加名为“自动运行”的新字符串值 将该值更改为chcp 65001 接近

将NLS_LANG设置为.AL32UTF8

开始->运行->重新编辑 转到[HKEY\U LOCAL\U MACHINE\Software\Oracle\{OracleHome}] 添加名为NLS_LANG的新字符串值 将该值更改为.AL32UTF8 关 现在,当您打开CMD时,您可以找到活动的代码页:65001,您可以直接使用sqlplus

Microsoft Windows [Version 10.0.15063]
(c) 2017 Microsoft Corporation. All rights reserved.
Active code page: 65001

C:\Users\ahmed>sqlplus

SQL*Plus: Release 12.2.0.1.0 Production on Sat Dec 23 16:10:23 2017

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter user-name: system
Enter password:
Last Successful login time: Sat Dec 23 2017 15:58:21 +03:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> select * from employee;

FNAME      LNAME      PHONE            AMOUNT
---------- ---------- ------------ ----------
أ ح م د       Saleh      966000000001      30000
Saleh      Salem      966000000001      40000
ح س ن        Damis      966000000001      25000
Ahmad      Saleh      966000000001      25000
Abbas      Motwali    966000000001      20000

SQL>
二,。用Java显示阿拉伯语: @Plirkee先生建议采取以下措施:

c:\> chcp 65001
c:\> set NLS_LANG=.AL32UTF8
c:\> sqlplus ...
// Getting the output stream of the file for writing
    File file = new File(Constants.JSON_FILE_PATH);
    FileOutputStream fileOutputStream = new FileOutputStream(file);
//  PrintWriter printWriter = new PrintWriter(fileOutputStream);  // old line 
// make sure that the stuff you are writing to the file is utf-8
    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8)); 
这会解决问题吗?????将字符转换为未知内容,如ØØÙ…Ø 要解决此问题,除了Mr@Plirkee answer之外,请确保将IDE编码更改为UTF-8(假设您正在使用Eclips):

窗口->首选项->常规->工作区->文本文件编码

改为UTF-8

请注意,您不应在问题中插入屏幕截图。编辑您的问题并将结果作为文本。请注意,您不应在问题中插入屏幕截图。编辑您的问题并将结果作为文本。关于添加cmd的代码页,请在我的主页上查看我的更新2question@AhmadSaleh我建议使用PrintWriter PrintWriter=new PrintWriternew OutputStreamWriterfileOutputStream,StandardCharsets.UTF_8;要确保写入文件的内容是utf-8。。。艰难,这是一个长期的…关于添加cmd的代码页,请检查我的更新2在我的网页上question@AhmadSaleh我建议使用PrintWriter PrintWriter=new PrintWriternew OutputStreamWriterfileOutputStream,StandardCharsets.UTF_8;要确保写入文件的内容是utf-8。。。艰难,这是一个很长的机会。。。