Я столкнулся с проблемой получения арабского контента из Oracle Database 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"
}
]
}
Когда я использую sql-разработчика, я могу SELECT
, INSERT
арабские значения
Я использую Oracle на своем ноутбуке для обучения:
- Ноутбук с Windows 10 (вошел в систему с правами администратора Windows 10)
- Oracle 12c (вошел в систему под системным пользователем)
- версия java "1.8.0_152"
Я нашел много вопросов здесь и в Интернете, например:
- Невозможно вставить арабские символы в базу данных Oracle
- как вставить арабский текст в базу данных Oracle?
- https://dba.stackexchange.com/questions/23692/arabic-characters-not-displaying-in-oracle-database
- https://community.oracle.com/thread/2529426?start=0&tstart=0
но, к сожалению, я не могу использовать эту команду в sqlplus
SHUTDOWN IMMEDIATE
он возвращает это сообщение об ошибке
ORA-01031: недостаточные привилегии
Я нашел этот ответ на https://itkbs.wordpress.com/2016/02/05/solving-ora-01031-insufficient-privileges-while-connecting-as-sqlplus-as-sysdba/
но, к сожалению, у меня нет раздела "локальные пользователи и группы", я думаю, это только на Windows NT или сервере
Также один из ответов в Интернете предлагал добавить "NLS_LANG" в системный реестр и присвоить значение AR8MSWIN1256 для арабского Unicode (на самом деле были разные значения) а>
к сожалению, я столкнулся с другой проблемой
ORA-12505, TNS: слушатель в настоящее время не знает SID, указанный в дескрипторе подключения
а в sql plus я получаю эту ошибку:
Я последовал этому ответу, но он не подключается к моей базе данных
но это продолжает вызывать у меня ту же проблему
поэтому я переименовал созданный мной раздел реестра "NLS_LANG" на другое имя, где это единственное, что я действительно изменил, чтобы вернуть все обратно, и база данных снова работает
Итак, мой вопрос:
- Как
Insert
иSelect
данные в арабском значении? (Я не знаю, в чем проблема Oracle, Java или SQLPLUS!)
Обновление 1. Мой код Java:
** Класс OracleDBConnect2: **
пакет com.oracle.testconnect;
import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map;
import org.json.JSONArray; import 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 class Convertor {
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 на арабские коды, также я создал пустой файл с именем «عربي», когда я тестировал команду ls, он отображает имя, подобное этому '' $ '\ 330 \ 271 \ 330 \ 261 \ 330 \ 250 \ 331 \ 212'
в то время как, когда я пытаюсь выбрать оператор sqlplus, я получаю арабское значение как ????
Я понимаю, что есть вероятность, что 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>