影響Oracle數據庫字符集最重要的參數是NLS_LANG參數。
它的格式如下: NLS_LANG = language_territory.charset
它有三個組成部分(語言、地域和字符集),每個成分控制了NLS子集的特性。
其中:
Language: 指定服務器消息的語言, 影響提示信息是中文還是英文
Territory: 指定服務器的日期和數字格式,
Charset: 指定字符集。
如:AMERICAN _ AMERICA. ZHS16GBK
從NLS_LANG的組成我們可以看出,真正影響數據庫字符集的其實是第三部分。
所以兩個數據庫之間的字符集只要第三部分一樣就可以相互導入導出數據,前面影響的只是提示信息是中文還是英文。
Oracle提供若干NLS參數定製數據庫和用戶機以適應本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通過查詢以下數據字典或v$視圖查看。
NLS_DATABASE_PARAMETERS:顯示數據庫當前NLS參數取值,包括數據庫字符集取值
NLS_SESSION_PARAMETERS: 顯示由NLS_LANG 設置的參數,或經過alter session 改變後的參數值(不包括由NLS_LANG 設置的客戶端字符集)
NLS_INSTANCE_PARAMETE: 顯示由參數文件init<SID>.ora 定義的參數
V$NLS_PARAMETERS:顯示數據庫當前NLS參數取值
SQL> select * from nls_database_parameters;
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE AMERICAN /*國家:影響錯誤信息的顯示語言。
NLS_TERRITORY NEW ZEALAND /*地域:影響時間顯示格式
NLS_CURRENCY $
NLS_ISO_CURRENCY NEW ZEALAND
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET AL32UTF8 /*數據庫字符集
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD/MM/RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH24:MI:SSXFF
PARAMETER VALUE
------------------------------ ------------------------------
NLS_TIMESTAMP_FORMAT DD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16 /*國家字符集默認值
NLS_RDBMS_VERSION 11.2.0.2.0
20 rows selected.
===以下內容來自百度====
字符集,實質就是按照一定的字符編碼方案,對一組特定的符號,分別賦予不同數值編碼的集合。Oracle數據庫最早支持的編碼方案是US7ASCII。Oracle的字符集命名遵循以下命名規則:<Language><bitsize><encoding> 即: <語言><比特位數><編碼> 。比如: AL32UTF8表示:AL,代表all,指使用所有語言;32,,32位;UTF8編碼。查看環境變量發現:NLS_LANG=American_America.AL32UTF8,American表示語言;America表示地區;AL32UTF8字符集類型。
2.2 字符編碼方案
2.2.1單字節編碼 (1)單字節7位字符集,可以定義128個字符,最常用的字符集爲US7ASCII (2)單字節8位字符集,可以定義256個字符,適合於歐洲大部分國家 例如:WE8ISO8859P1(西歐、8位、ISO標準8859P1編碼)
2.2.2多字節編碼 (1)變長多字節編碼 某些字符用一個字節表示,其它字符用兩個或多個字符表示,變長多字節編碼常用於對亞洲語言的支持, 例如日語、漢語、印地語等 例如:AL32UTF8(其中AL代表ALL,指適用於所有語言)、
(2)定長多字節編碼 每一個字符都使用固定長度字節的編碼方案,目前oracle唯一支持的定長多字節編碼是AF16UTF16,也是僅用於國家字符集
UTF-8是unicode的8位編碼方式,是一種變長多字節編碼,這種編碼可以用1、2、3個字節表示一個unicode字符,AL32UTF8,UTF8、UTFE是UTF-8編碼字符集 .如果需要存儲多國語言文字,那就要選擇UTF8了
2.1 字符集 實質就是按照一定的字符編碼方案,對一組特定的符號,分別賦予不同數值編碼的集合。Oracle數據庫最早支持的編碼方案是US7ASCII。 Oracle的字符集命名遵循以下命名規則: <Language><bit size><encoding> 即: <語言><比特位數><編碼> 比如: ZHS16GBK表示採用GBK編碼格式、16位(兩個字節)簡體中文字符集
2.2.3 unicode編碼 Unicode是一個涵蓋了目前全世界使用的所有已知字符的單一編碼方案,也就是說Unicode爲每一個字符提供唯一的編碼。UTF-16是unicode的16位編碼方式,是一種定長多字節編碼,用2個字節表示一個unicode字符,AF16UTF16是UTF-16編碼字符集。 UTF-8是unicode的8位編碼方式,是一種變長多字節編碼,這種編碼可以用1、2、3個字節表示一個unicode字符,AL32UTF8,UTF8、UTFE是UTF-8編碼字符集
2.4.1字符集 (1)用來存儲CHAR, VARCHAR2, CLOB, LONG等類型數據 (2)用來標示諸如表名、列名以及PL/SQL變量等 (3)用來存儲SQL和PL/SQL程序單元等
2.4.2國家字符集: (1)用以存儲NCHAR, NVARCHAR2, NCLOB等類型數據 (2)國家字符集實質上是爲oracle選擇的附加字符集,主要作用是爲了增強oracle的字符處理能力,因爲NCHAR數據類型可以提供對亞洲使用定長多字節編碼的支持,而數據庫字符集則不能。
國家字符集在oracle9i中進行了重新定義,只能在unicode編碼中的AF16UTF16和UTF8中選擇,默認值是AF16UTF16
我們在創建數據庫時,需要考慮的一個問題就是選擇什麼字符集與國家字符集(通過create database中的CHARACTER SET與NATIONAL CHARACTER SET子句指定)。考慮這個問題,我們必須要清楚數據庫中都需要存儲什麼數據,如果只需要存儲英文信息,那麼選擇US7ASCII作爲字符集就可以;但是如果要存儲中文,那麼我們就需要選擇能夠支持中文的字符集(如ZHS16GBK);如果需要存儲多國語言文字,那就要選擇UTF8了。
有過一些Oracle使用經驗的朋友,大多會知道通過NLS_LANG來設置客戶端的情況,NLS_LANG由以下部分組成:NLS_LANG=<Language>_<Territory>.<Clients Characterset>,其中第三部分<Clients Characterset>的本意就是用來指明客戶端操作系統缺省使用的字符集。所以按正規的用法,NLS_LANG應該按照客戶端機器的實際情況進行配置,尤其對於字符集一項更是如此,這樣Oracle就能夠在最大程度上實現數據庫字符集與客戶端字符集的自動轉換(當然是如果需要轉換的話)。
字符集:將特定的符號集編碼爲計算機能夠處理的數值;字符集間的轉換:對於在源字符集與目標字符集都存在的符號,理論上轉換將不會產生信息丟失;而對於在源字符集中存在而在目標字符集中不存在的符號,理論上轉換將會產生信息丟失;數據庫字符集:選擇能夠包含所有將要存儲的信息符號的字符集;客戶端字符集設置:指明客戶端操作系統缺省使用的字符集。
但實際上總結起來也很簡單,要想在字符集方面少些錯誤與麻煩,需要堅持兩條基本原則:在數據庫端:選擇需要的字符集(通過create database中的CHARACTER SET與NATIONAL CHARACTER SET子句指定);在客戶端:設置操作系統實際使用的字符集(通過環境變量NLS_LANG設置)。
很多人都遇到因爲字符集不同而導入失敗的情況,這涉及3方面的字符集,oracle server 端字符集.oracle clinet端字符集,dump文件字符集。在做數據導入時,需要這三個字符集一致纔可以。
第一個方面:查看oracle server端的字符集,比較直觀的做法:
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.WE8MSWIN1252
第二方面:dump文件的字符集:
dump文件的第2個和第3個字節記錄了dump文件的字符集。如果dump文件不大,幾十M,可以用untraedit打開。看第2第3個字節,如果是0354,用一下sql查詢
SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;
NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX'
----------------------------------------
ZHS16GBK
SQL>
第三方面:oracele client端的字符集:
在windows下就是註冊表裏,oraclehome目錄下,nls_lang ,還可以在doc下自己設置:
set nls_lang=AMERICAN_AMRICA.ZHS16GBK
這樣隻影響這個窗口裏面的環境變量。
在unix平臺下,就是環境變量。
echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
如果檢查結果發現server端與client端字符集不一致,請統一改爲同server端相同的字符集。
[julia@oc2365548284 Desktop]$ echo $LANG
en_US.utf8
[julia@oc2365548284 Desktop]$
[julia@oc2365548284 Desktop]$ set LANG=ZH_CN.utf8
[julia@oc2365548284 Desktop]$ 看看看可能