2014-05-12 88 views
1

我在使用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); 

請幫我解決這個問題嗎? 謝謝。

新注:

數據庫本身不使用UTF-16字符集,但

「的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

+0

你有你的類路徑上的orai18n.jar? http://docs.oracle.com/cd/E11882_01/java.112/e16548/global.htm#JJDBC28643 –

+0

不,我沒有它,我會嘗試:)並感謝您的信息和參考鏈接: ) – UsifShahin

回答

-1

首先,你可以檢查使用 的SQL * PLUS命令你的數據庫的NLS_CHARACTERSET參數: -

SELECT * FROM V $ NLS_PARAMETERS其中參數= 'NLS_CHARACTERSET';

結果應該是

參數

VALUE

NLS_CHARACTERSET

AR8MSWIN1256

,如果不是的話,你必須改變使用這個參數的值: -

  • 擊中Windows鍵+ R鍵盤上

  • 寫: - SQLPLUS sys作爲sysdba的

  • 按回車鍵,然後輸入密碼,或只是觸及輸入

  • 發出以下命令:

  • SHUTDOWN IMMEDIATE

  • STARTUP RESTRICT

  • ALTER數據庫字符集INTERNAL_USE AR8MSWIN1256;

  • ALTER數據庫字符集AR8MSWIN1256;

  • SHUTDOWN IMMEDIATE

  • STARTUP

  • 變化NLS_LANG註冊表字符串的值到AMERICAN_AMERICA.AR8MSWIN1256

    如果你的操作系統是UNIX使用

  • 的味道

AR8ISO8859P6代替AR8MSWIN1256值NLS_CHARACTERSET

  • 不要在數據庫中使用的數據類型國家(即NVARCHAR,NTEXT或NCLOB),除非你打算使用其他語言(阿拉伯文和英文)

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

取自

+0

非常感謝我的一個老問題,但這是解決方案 – UsifShahin

+0

@UsifShahin歡迎您 –

+0

ALTER DATABASE CHARACTER SET ...自Oracle 10g以來不再支持。你不應該使用它,你可能會破壞你的數據庫。請遵循Oracle的官方指南:[字符集遷移](https://docs.oracle.com/database/121/NLSPG/ch11charsetmig.htm#NLSPG011)或使用[DMU - 用於Unicode的數據庫遷移助理](https: //docs.oracle.com/cd/E89575_01/DUMAG/toc.htm) –

0

檢查你的Oracle版本。如果它老,它​​不能支持UTF16。

這裏是一篇文章 - 希望它會有用。

http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch6unicode.htm

+0

Oracle版本是11 G企業版11.1.0.7.0,我已經使用這些數據從另一個程序創建了表格,正如我所提到的,我可以通過將其從UTF16轉換爲Cp1256來讀取數據,但是在插入並更新到數據庫。 – UsifShahin

+0

我添加了一個新的註釋,使事情更清楚我的問題,請檢查它,如果你可以@ user3082691 – UsifShahin