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