解決Oracle 中文亂碼

1、什麼是oracle字符集

  Oracle字符集是一個字節數據的解釋的符號集合,有大小之分,有相互的包容關係。ORACLE 支持國家語言的體系結構容許你使用本地化語言來存儲,處理,檢索數據。它使數據庫工具,錯誤消息,排序次序,日期,時間,貨幣,數字,和日曆自動適應本地化語言和平臺。
SELECT * FROM V$NLS_PARAMETERS
1       NLS_LANGUAGE SIMPLIFIED CHINESE
2       NLS_TERRITORY         CHINA
3       NLS_CURRENCY RMB
4       NLS_ISO_CURRENCY CHINA
5       NLS_NUMERIC_CHARACTERS       .,
6       NLS_CALENDAR GREGORIAN
7       NLS_DATE_FORMAT     DD-MON-RR
8       NLS_DATE_LANGUAGE         SIMPLIFIED CHINESE
9       NLS_CHARACTERSET AL32UTF8
10      NLS_SORT BINARY
11      NLS_TIME_FORMAT      HH.MI.SSXFF AM
12      NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM
13      NLS_TIME_TZ_FORMAT        HH.MI.SSXFF AM TZR
14      NLS_TIMESTAMP_TZ_FORMAT       DD-MON-RR HH.MI.SSXFF AM TZR
15      NLS_DUAL_CURRENCY        RMB
16      NLS_NCHAR_CHARACTERSET      UTF8
17      NLS_COMP         BINARY
18      NLS_LENGTH_SEMANTICS    BYTE
19      NLS_NCHAR_CONV_EXCP    FALSE

2、如何查詢Oracle的字符集
ORACLE有三方面的字符集,一是oracel server端的字符集,二是oracle client端的字符集;三是dmp文件的字符集。在作數據導入的時候,須要這三個字符集都一致才能正確導入。
--查看oracel server端的字符集
select userenv('language') from dual;
1              SIMPLIFIED CHINESE_CHINA.AL32UTF8

--查看dmp文件的字符集
用oracle的exp工具導出的dmp文件也包含了字符集信息,dmp文件的第2和第3個字節記錄了dmp文件的字符集。若是dmp文件不大,好比只有幾M或幾十M,能夠用UltraEdit打開(16進制方式),看第2第3個字節的內容,如0354,而後用如下SQL查出它對應的字符集:
select nls_charset_name(to_number('0354','xxxx')) from dual

--查看oracel client端的字符集
  是註冊表裏面相應OracleHome的NLS_LANG。還能夠在dos窗口裏面本身設置,好比:
  set nls_lang=AMERICAN_AMERICA.ZHS16GBK
  這樣就隻影響這個窗口裏面的環境變量。

Oracle字符集亂碼問題析及解決辦法

1、問題描述

SQL Plus WorkSheet是一個窗口圖形界面的SQL語句編輯器,對於那些喜歡窗口界面而不喜歡字符界面的用戶,該工具相對SQL/PLUS受到了很大的歡迎。但從Oracle 8i之後,若是安裝Oracle 8i時選取的是別於英語的字符集,對於咱們中國,一般會選取簡體中文字符集(ZHS16GBK),安裝成功後,運行SQL Plus WorkSheet程序,會出現全部的中文顯示以及查詢結果均爲亂碼的狀況。

2、問題分析

最初出現該問題,首先懷疑就是安裝時字符集設置有問題,也就是說沒有設置正確的簡體中文字符集。首先檢查數據庫字符集,在SQL/PLUS中,運行下面的SQL語句,檢查所鏈接數據庫的字符集:


SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
SIMPLIFIED CHINESE_CHINA.ZHS16GBK

查詢結果發現數據庫安裝時所選字符集爲簡體中文ZHS16GBK,說明安裝時字符集設置徹底正確。第二步開始懷疑是用戶客戶端字符集問題,檢查客戶端註冊表,打開註冊表編輯程序(RegEdit),在HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/NLS_LANG,發現Oracle客戶端字符集爲AMERICAN_AMERICA.ZHS16GBK,設置也徹底正確,能夠排除是客戶端字符集設置錯誤的問題。同時還有一個現象就是在同一個客戶端機器上SQL/PLUS中的查詢字符集顯示徹底正常,這也說明不是字符集設置問題,而是系統程序SQL/Plus Worksheet的問題。

在Oracle 8i之前的版本中,歷來沒有出現過這樣的狀況,這應該和Oracle版本有關,咱們知道Oracle 8i和它前面的版本一個顯著的區別就是大部分的Oracle系統程序,如今均採用Java驅動,其實這也就是產生字符集亂碼問題的根本所在。非Java驅動的程序,如SQL*Plus,有一個系統參數NLS_LANG,該參數在UNIX系統中設置在環境變量中,在Windows操做系統中設置在註冊表中,這個參數決定了客戶端應用程序的字符集。而對於基於Java應用的程序,如如今遇到的SQL*PLus Worksheet,NLS_LANG參數對這類程序是不起任何做用的。

3、解決方案

找到了問題產生的緣由後,下面來討論如何解決該問題。對於Oracle Enterprise Manager中的全部工具,有一個配置文件名爲dbappscfg.properties,修改該文件便可解決上述問題。這個文件的位置在$ORACLE_HOME\sysman\config目錄下,用任何的文本編輯器打開該文件,在這個文件裏面,找到這樣一項,


# SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

去掉註釋符#,同時將其修改成


SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

對於Windows操做系統,還須要修改一項,在文件中找到# SQLPLUS_SYSTEMROOT=c:\\WINNT40,去掉註釋符,將其修改成你所在機器的操做系統主目錄。如操做系統的主目錄在D盤的Winnt下,則將其修改成

SQLPLUS_SYSTEMROOT=d:\\WINNT。

對於後面一項的修改只對Windows操做系統進行,對UNIX操做系統則不須要。若是在Windows操做系統中不修改該項,在Oracle Enterprise Manager中,鏈接系統時,會提示以下的錯誤:


ORA-12560 TNS:protocol adapter error

或者


ORA-12545 Connect failed because target host or object does not exist

修改完成後,保存文件,退出編輯。從新鏈接SQL PLUS Worksheet,字符集亂碼問題獲得解決,顯示正確的簡體中文字符集。

問題: 使用Oracle Instant Client 出現 ORA-12705: Cannot access NLS data files or invalid environment specified 錯誤。

若是是Windows平臺,註冊表裏 \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 查找鍵 NLS_LANG,這個鍵由Oracle標準客戶端安裝建立, 值是 NA 。這個致使了 ORA-12705錯誤。解決方法就是更名 NLS_LANG。

Linux下 若是環境變量 NLS_LANG 值是NA 會引發 ORA-12705 錯誤,解決方法是刪除這個變量 
unset NLS_LANG
相關文章
相關標籤/搜索