查當前資料庫字元集
BYS@bys1>select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8
BYS@bys1>select * from nls_database_parameters;
PARAMETER VALUE
------------------------------ --------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET AL32UTF8
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXF
F AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXF
F AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET UTF8
NLS_RDBMS_VERSION 11.2.0.1.0
[oracle@bys001 ~]$ export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
[oracle@bys001 ~]$ echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
顯示字元使用的是作業系統的字元集,比如在中文WIN下,使用SSH登陸英文LINUX,
然後再用 SQLPLUS登陸到資料庫進行查詢,如果查詢結果有漢字,則可以顯示。
如果直接登陸英文LINUX,用 SQLPLUS登陸到資料庫進行查詢,是不能正常顯示漢字的。
用戶端字元集的設定是為了讓資料庫知道我們傳遞過去的字元是屬於哪種字元集,
以便於ORACLE在儲存字元時做相應的編碼映射。
其實亂碼,說到底就是用於顯示字元的作業系統沒有在字元編碼中找到對應的字元導致的,造成這種現象的主要原因就是:
1:輸入操作的os字元編碼和查詢的os字元編碼不一致導致出現亂碼。
2:輸入操作的用戶端字元集(nls_lang)和查詢用戶端字元集(nls_lang)不同,也可能導致查詢返回亂碼或者錯誤的字元。
還有一個問題需要解釋一下:
在上面的例子中,相同的字元在不同的字元集中對應著不同的字元編碼,這個通常稱為字元集不相容或者不完全相容,比如zhs16gbk和al32utf8,他們儲存的ascii碼的字元編碼都是相同的,但對於漢字卻是不同的。
如果兩個字元集對於相同的字元採用的相同的字元編碼,我們稱之為字元相容,範圍大的叫做範圍小的字元集的超級。我們通常遇到的zhs16cgb231280,zhs16gbk就是這樣的情況,後者是前者的超級。