当前位置: 首页 > 知识库问答 >
问题:

在Oracle 12C上插入/检索阿拉伯文数据

公羊曜灿
2023-03-14

我正面临着从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"
      }
   ]
}

  • windows 10笔记本电脑(使用windows 10管理用户登录)
  • Oracle 12C(使用系统用户登录)
  • Java版本“1.8.0_152”

我在这里和网上找到了很多问题,比如:

  • 无法将阿拉伯字符插入oracle数据库
  • 如何将阿拉伯文文本插入oracle数据库?
  • https://dba.stackExchange.com/questions/23692/arabic-characters-not-display-in-oracle-database
  • https://community.oracle.com/thread/2529426?start=0&tstart=0
SHUTDOWN IMMEDIATE

但不幸的是,我没有“本地用户和组”部分,我想它只在windows NT或服务器上

不幸的是我遇到了另一个问题

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

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

  • https://chartio.com/resources/tutorials/how-to-fix-ora-12505-tns-listener-does-not-current-know-of-SID-gived-in-connect-descriptor/

因此,我将创建的注册表项“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语句;导入java.text.SimpleDateFormat;导入java.util.ArrayList;导入java.util.Calendar;导入java.util.Date;导入java.util.HashMap;导入java.util.Map;

    导入org.json.jsonArray;导入org.json.JsonObject;

    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;
    }
    

    更新2:更改cmd上的代码页

    按照@plirkee和@vahadin的建议,我已经将CMD上的代码页更改为阿拉伯代码。我还创建了一个名为“fee”的空白文件,当我测试ls命令时,它显示的名称如下:'$'\330\271\330\261\330\250\331\212'

    而当我在sqlplus上尝试select语句时,得到的阿拉伯值为????

    我知道cmd可能不支持阿拉伯语,但oracle的结果(如果配置没有问题)不应显示为????而是将其显示为我在cmd中创建的文件名

    查看这是一张截图:

    C:\Users\ahmed\Documents>chcp 20420
    Active code page: 20420
    
    C:\Users\ahmed\Documents>ls
    'Custom Office Templates'  'My Videos'
     FeedbackHub                desktop.ini
    'HP ePrint'                 hp.applications.package.appdata
    'My Music'                  hp.system.package.metadata
    'My Pictures'              ''$'\330\271\330\261\330\250\331\212'
    
    C:\Users\ahmed\Documents>chcp 28596
    Active code page: 28596
    
    C:\Users\ahmed\Documents>ls
    'Custom Office Templates'  'My Videos'
     FeedbackHub                desktop.ini
    'HP ePrint'                 hp.applications.package.appdata
    'My Music'                  hp.system.package.metadata
    'My Pictures'              ''$'\330\271\330\261\330\250\331\212'
    
    C:\Users\ahmed\Documents>sqlplus
    
    SQL*Plus: Release 12.2.0.1.0 Production on Sat Dec 23 13:33:54 2017
    
    Copyright (c) 1982, 2016, Oracle.  All rights reserved.
    
    Enter user-name: system
    Enter password:
    Last Successful login time: Sat Dec 23 2017 13:27:42 +03:00
    
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    
    SQL> select * from employee
      2  ;
    
    FNAME      LNAME      PHONE            AMOUNT
    ---------- ---------- ------------ ----------
    ????       Saleh      966000000000      30000
    Saleh      Salem      966000000000      40000
    Hasan      Damis      966000000000      25000
    Ahmad      ?????      966000000000      25000
    Abbas      Motwali    966000000000      20000
    
    SQL>
    
  • 共有1个答案

    卢鸿博
    2023-03-14

    首先,alter DATABASE CHARACTER SET...自Oracle 10g起不再受支持。你不应该使用它,你可能会破坏你的数据库。遵循Oracle的官方指南:字符集迁移或使用DMU-Database Migration Assistant for Unicode

    NLS_LANG的格式为“language_tregentry.charset”。ar8mswin1256不工作,请使用带点的.ar8mswin1256(每个组件都是可选的,因此可以跳过语言和区域)

    SQLplus从命令行继承编码。如果使用CHCP 28596(表示ISO 8859-6(请参阅代码页标识符),则NLS_LANG值中的字符集必须为.AR8ISO8859P6(请参阅字符集)

    如果您希望使用nls_lang=.ar8mswin1256,则必须在启动SQLPlus之前运行chcp1256

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

    c:\> chcp 65001
    c:\> set NLS_LANG=.AL32UTF8
    c:\> sqlplus ...
    

    注意,环境变量(即set nls_lang=.al32utf8)优先于注册表设置。

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

    • 问题内容: 使用JDBC驱动程序从Java中的oracle中读取oracle阿拉伯字符时遇到问题,主要问题是我找不到正确的字符编码来获取正确的数据,但是我使用此方法手动解决了问题: 此方法可以给我正确的字符,如数据库中显示的那样,但是当我尝试更新/插入阿拉伯数据时,它将保存错误的字符。例如:我的文本在数据库中另存为“ ?????????” 而不是“مرحبا”。 这是我连接到oracle数据库的方

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

    • 问题内容: 我想在消息资源束(属性)文件中写“ Arabic”,但是当我尝试保存它时,出现此错误: “无法完成保存,某些字符无法使用“ ISO-85591-1”字符编码进行映射。更改编码或删除字符…” 有人可以指导吗? 我想写: global.username =اسمالمستخدم 如何在属性文件中写“用户名”的阿拉伯语?因此,国际化是有效的。 BR SC 问题答案: http://sourc

    • 问题内容: 我正在评估NLTK处理阿拉伯文本的能力,这项研究旨在分析和提取情感。 问题如下: NTLK是否可以处理并允许分析阿拉伯文本? python是否能够操纵\标记阿拉伯文本? 我可以使用Python解析和存储阿拉伯文本吗? 如果python和NTLK不是完成这项工作的工具,那么您会推荐哪些工具(如果存在)? 谢谢。 编辑 根据研究: NTLK仅能阻止阿拉伯文本:链接 Python支持UTF-

    • 我想知道每个阿拉伯语字母的唯一代码,以将阿拉伯语文本显示为文本视图。 当我给直作为一个字符串,但它不会显示像阿拉伯文本格式。它显示每一个字母分开。我尝试了谷歌的几个链接。但我没有得到我要找的东西。 实际上,我正在寻找每一个阿拉伯字母的唯一代码。这样我就可以用阿拉伯语文本格式显示我的句子了。