Oracle全球化支持:字符集系統介紹及服務器端、客戶端設置

分類:編程 時間:2016-11-04

1. 字符集與編碼常識

字符集:

人們根據需要把某些字符收集到一處,並賦以名稱,於是便有了某某字符集。

例如:

ASCII

ASCII字符集:包含大小寫英文、阿拉伯數字、標點,以及一些不可見的控制符共128個。

ASCII編碼:使用7位表示一個字符。編碼範圍是[0-127](即Hex[00-7F]),其中[0-31](Hex[00-1F])部分以及127(Hex7F)是控制符,其余的都是些可見字符。

GB2312:

GB2312字符集:ASCII字符集+7000左右漢字字符。

GB2312編碼:兼容ASCII編碼。對字節進行判斷,如值<=127,則意義等同於ASCII編碼;如值>127,則它需要跟其後的另一個字節合並表示一個字符。其理論漢字編碼空間為128X256,超過3萬個字符。

GBK

GBK字符集:GB2312字符集+20000左右漢字字符。

GBK編碼:兼容GB2312編碼。利用了GB2312編碼閑置的編碼空間。

GB18030:

GB18030字符集:GBK字符集+若幹漢字+若幹少數民族字符,為目前國內最新的字符集。

GB18030編碼:兼容GBK編碼。繼續利用GBK編碼閑置的編碼空間,對於超出編碼空間的則采用4個字節表示。

BIG5

BIG5字符集:ASCII字符集+13000左右漢字(繁體)。

BIG編碼:兼容ASCII編碼。其編碼模式類似於GB2312.

UNICODE:(UNICODE一詞在日常使用中顯得寬泛、混亂,在不同的語境中可以是以下意思之一。)

UNICODE標準:由一些組織提出的一套標準,對人類文字的顯示、編碼等進行了一系列的規定。

UNICODE字符集:目前最新版的UNICODE字符集中已經包含各種語言的超過10萬的字符。

UNICODE編碼:(狹義的UNICODE編碼可能指UCS-2,也可能指UTF-16;廣義的UNICODE編碼可以指包括以下四種在內的若幹種對UNICODE標準的編碼實現。)

1. UTF-32編碼:固定使用4個字節來表示一個字符,存在空間利用效率的問題。

2. UTF-16編碼:對相對常用的60000余個字符使用兩個字節進行編碼,其余的(即’補充字符supplementary characters’)使用4字節。

3. UCS-2編碼:是對UNICODE早期版本的實現,它與UTF-16的唯一區別是它不包括’補充字符’,所以它對字符的編碼只使用兩個字節。目前此編碼模式已過時

4. UTF-8編碼:兼容ASCII編碼;拉丁文、希臘文等使用兩個字節;包括漢字在內的其它常用字符使用三個字節;剩下的極少使用的字符使用四個字節。

ISO8859-1:(使用Oracle的同誌們可能見過這個WE8ISO89859P1,沒錯,就是它。)

ISO8859-1字符集:ASCII字符集+若幹西歐字符,例如字母?、?。

ISO8859-1編碼:使用8位表示一個字符,同時移除了原ASCII編碼中的控制符(即[0-31],及127)。

Code page:(可以把”code page”認為是”編碼”的近義詞。至於為什麽有這個名稱?歷史遺留問題。)

ANSI code pages:你一定見過ANSI,想想另存文本文件時。ANSI code pages實際上是一系列的編碼集合,根據操作系統區域設置而激活其中一種作為默認ANSI編碼。例如公司電腦(英文系統)上的ANSI code page可能是1252,而家裏的中文系統則可能是936。所以在家裏可以用ANSI存儲一個包含中文的文本文件,在公司則不行。可以在註冊表鍵:HKEY_LOCAL_MACHINE\system\CurrentControlSet\Control\NLS\CodePage\ACP中查看到當前使用的ANSI code page。 C#可以通過Encoding.Default查看。

OEM code pages: OEM code pages是給控制臺應用程序(如SQLPLUS)使用的。除CJK環境(Chinese-Japanese-Korean)外,Windows使用不同的ANSI code page和OEM code page。例如,公司英文系統上使用的是437。可以使用CHCP命令查看當前使用的OEM code page, C#可以通過Console.OutputEncoding查看。

Code page 1252:

cp1252字符集:ASCII字符集+若幹西歐字符+若幹特殊符號,比如?、‰.

cp1252編碼:使用8位表示一個字符。編碼範圍是[0-255](即Hex[00-FF]),[0-127]部分與ASCII相同,新增的大部分是西歐的字符,例如一些帶上標的字母?、?,以及像這樣一類特殊符號)

PS1:現實中兩臺PC上的code page信息

PC1:英文版Windows XP,ANSI code page=1252, OEMcode page=437

PC2:中文版Windows 7,ANSI codepage=936, OEM code page=936

PS2:cp1252與cp437編碼表下載請猛擊這裏,早期控制臺應用程序常常需要畫一些粗糙的表格等等圖形,所以可以在437中看到不少不同的橫線豎線這一類的特殊符號。

PS3:CP1252、ISO8859-1、ASCII比較,就實際使用的編碼範圍來說:CP1252>ISO8859-1>ASCII。ASCII是[0-127],CP1252是[0-255],ISO8859-1則移除了cp1252中[0-31]及127這些不可見的控制符,同進移除了[128-159](即Hex[80-9F])中的特殊符號。

2. 字符集

2.1. 編碼schema

§ 單字節字符集:

7bit: ASCII 7-bit American(US7ASCII)

8bit: ISO8859-1 West European(WE8ISO8859P1)、EBCDICCode Page 500 8-bit West European(WE8EBCDIC500)、DEC 8-bit WestEruopean(WE8DEC)

§ 變長多字節字符集:例如Japanese Extended UNIX Code(JEUC)、ChineseGB2312-80(GB2312-80)、AL32UTF8(UTF-8)

§ 定長多字節字符集:只有National Character Set(AL16UTF16)是定長多字節字符集,是2個字節的Unicode編碼

§ Unicode(AL32UTF8,AL16UTF16,UTF8):Oracle使用AL32UTF8、UTF8、UTFE作為數據庫字符集,使用AL16UTF16和UTF8作為國家語言字符集。

2.2. 數據庫字符集與國家字符集比較

為什麽要有兩個字符集?如果我知道只需要英文,設置數據庫字符集=US7ASCII,如果我知道只需要西歐字符,設置數據庫字符集=WE8MSWIN1252或者WE8ISO89859P1,或者幹脆就用AL32UTF8。你看,我只需要設定“數據庫字符集”,那麽“國家字符集”有什麽必要呢?

其實,考慮到歷史遺留問題以及數據庫創建者們無法避免的“短視”,很多現有數據庫都無法支持UNICODE字符集,例如要在現有的US7ASCII數據庫字符集的數據庫中存儲中文,這個時候“國家字符集”+NVARCHAR2這樣的組合就能救你一命了。對於數據類型為NVARCHAR2(以及NCHAR, NCLOB)的字段,它使用是國家字符集,與數據庫字符集的設置無關。自9i以後,國家字符集可選的只有AL16UTF16與AL32UTF8,UTF-16與UTF-8都是UNICODE編碼標準的實現,因些可以表示世界上幾乎所有的文字。

當然,如果數據庫字符集本身就使了UNICODE字符集,就沒有必要使用NVARCHAR2, NCHAR, NCLOB這些類型了。

數據庫字符集與國家字符集比較:

數據庫字符集

國家字符集

在創建時定義

在創建時定義

不重建不能再改變

除了一些例外,不重建不能再改變

用char、varchar2、clob、long存放數據列

用NCHAR、NVARCHAR2、NCLOB存放數據列

可以存放變長字符集

可以使用AL16UTF16或者UTF8存放Unicode

Oracle對字符集的命名實際上有一定的規則可尋,例如:

AL32UTF8

【AL】支持所有語言(All Language)。

【32】每字符最多占用32位(4字節)。

【UTF8】編碼為UTF-8。

WE8MSWIN1252

【WE】支持西歐語言(Western Europe)。

【8】每字符需要占用8位(單字節)。

【MSWIN1252】編碼為CP1252。

US7ASCII

【US】表示美國(United States)。

【7】每字符需要占用7位。

【ASCII】編碼為ASCII。

其它如ZHS16GBK,ZHT16BIG5,US8PC437(編碼為OEM cp437),都可以類推。

2.3. 選擇數據庫字符集

因為數據庫字符集是用來辨別、維護SQL與PLSQL源代碼,所以,它必須是EBCDIC或者7-bit ASCCII的一個超集,這使得平臺本地化,因此它不可能使用定長多字節字符作為數據庫字符集(即不能用AL16UTF16來作為數據庫字符集)

EBCDIC平臺上不能使用基於ASCII的字符集,反之亦然

2.4. 選國家字符集

有兩種選擇:AL16UTF16、UTF8

如果創建數據庫時沒有指定國家字符集,則默認是AL16UTF16.使用NVARCHAR2等數據類型時,文本內容采用國家字符集來存儲和管理,而不是默認的數據庫字符集。

這取決於空間和效率的考慮,AL16UTF16是定長的(2字節),而UTF8是變長的,可以在1到3字節之間,在UTF8中歐洲字符是1到2個字節,所以相對於AL16UTF16要節省空間,而亞洲字符集則用三個字節存儲,所以要比AL16UTF16要的空間多。

AL16UTF16是固定長度編碼,所以會比UTF8執行的快。

3.Specifying Language-Dependent Behavior

There are threeways to specify National Language Support (NLS) parameters:

§ 服務器端的初始化參數指定默認的server環境,該默認值對客戶端無效。

§ Asenvironment variables for the client to specify locale-dependent behavioroverriding the defaults set for the server。

§ As theALTER SESSIONparameter to override the default set for the client or the server

alter session最高,環境變量次之,初始化參數最低;

3.1. 對服務器進行設置

NLS_LANGUAGE初始化參數:指定消息的語言、日期和月份的名稱以及他們的縮寫、A.D.、B.C.等的表現形式以及默認的排序機制。

NLS_TERRITORY初始化參數:指定星期與日期的numbering,默認的日期格式、10進制字符、groupsepartor和默認的ISO、當地貨幣標識、星期的開始時間等.

The NLS_LANGUAGE initializationparameter determines the default values of the following parameters: NLS_DATE_LANGUAGE,NLS_SORT.

NLS_TERRITORYdetermines the default values for the following parameters: NLS_CURRENCY,NLS_ISO_CURRENCY,NLS_DATE_FORMAT, NLS_NUMBERIC_CHARCTERS.

參數

NLS_LANGUAGE

NLS_DATE_LANGUAGE

NLS_SORT

AMERICAN

AMERICAN

BINARY

NLS_TERRITORY

NLS_CURRENCY

NLS_ISO_CURRENCY

NLS_DATE_FORMAT

NLS_NUMBERIC_CHARCTERS

AMERICAN

$

AMERICAN

DD-MON-RR

,.

 

 

 

 

 

 

 

 

 

 

3.2. Specifying Language-DependentBehavior for the Session

? Environment variable:

–NLS_LANG=French_France.UTF8

? Additional environmentvariables:

–NLS_DATE_FORMAT

–NLS_DATE_LANGUAGE

–NLS_SORT

–NLS_NUMERIC_CHARACTERS

–NLS_CURRENCY

–NLS_ISO_CURRENCY

–NLS_CALENDAR

Each component controls a subset of NLSfeatures:

NLS_LANG=<language>_<territory>.<charset>

where:

Language: Overrides the value ofNLS_LANGUAGEand controls the same features as

NLS_LANGUAGE

Territory: Overrides the value ofNLS_TERRITORYand controls the same features as

NLS_TERRITORY

Charset: Specifies the character encodingscheme used by client application (usually that of the user’s terminal)

NLS_LANG defines a client terminal’s characterencoding scheme. Different clients can use

different encoding schemes. Data passedbetween the client and the server is converted

automatically between the two encodingschemes. The database encoding scheme should be a superset, or equivalent, ofall the client encoding schemes. The conversion is transparent to the clientapplication.

下面這段話說明如果數據庫字符集是英文,例如WE8MSWIN1252,想要存儲中文是會出現問題的:

When the databasecharacter set and the client character set are the same, Oracle assumes that thedata being sent or received is of the same character set, so no validations orconversions are performed. Although the benefit of this scenariois betterperformance, misuse can lead to possible data inconsistency problems, such asstoring data from another character set that is different from the databasecharacter set.

For example, yourdatabase character set is US7ASCIIand you are using Simplified Chinese Windowsas your client terminal. By setting NLS_LANGto SIMPLIFIED

CHINESE_HONGKONG.US7ASCIIasthe client character set, it is possible for you to store

multibyte SimplifiedChinese characters inside a single byte database. This means that Oracle willtreat these characters as single-byte US7ASCIIcharacters, and therefore, allSQL string manipulation functions such as SUBSTRor LENGTHwill be based on bytesrather than characters. All of your non-ASCII characters could be lostfollowing an export and import into another database.

3.3. Windows下常用客戶端設置PL/SQL Developer

1、影響PL/SQL DEVELOPER字符集顯示的要素

OS系統當前字符集

使用chcp查看coding page,936表示操作系統當前字符集為簡體中文,同ZHS16GBK..

ORACLE註冊表

在ORACLE目錄下NLS_LANG,如AMERICAN_AMERICA.ZHS16GBK

該鍵值默認讀取OS系統當前字符集,當然可以修改。

系統環境變量NLS_LANG

環境變量影響DOS窗口、sql*plus、PL/SQL DEVELOPER等應用.

ORACLE數據庫字符設置

select * from NLS_DATABASE_PARAMETERS n where n.PARAMETER='NLS_CHARACTERSET';

PARAMETER VALUE

NLS_CHARACTERSET ZHS16GBK

PL/SQL DEVELOPER菜單中TOOLS中首選項的'unicode support'

若選中此項,將從 Oracle Server 中按原樣獲取 Unicode 數據,並將其顯示為 Unicode

文本。若禁用此項,則來自服務器的 Unicode 數據將根據 Oracle HomeRegistry 的

NLS_LANG 鍵轉換為 Oracle Client 的字符集。

寫入中文時一定要指定環境變量NLS_LANG(註意是環境變量,不是註冊表),只要指定了,輸入中文便能正確寫入,無其他要求。

4. 獲取語言字符集信息

數據庫服務器NLS_DATABASE_PARAMETERS(props$):

§ Parameter(NLS_CHARACTERSET,NLS_NCHAR_CHARCTERSET)

§ VALUE

查詢結果中NLS_CHARACTERSET表示字符集,NLS_NCHAR_CHARACTERSET表示國家字符集

客戶端字符集NLS_INSTANCE_PARAMETERS(來自於V$NLS_PARAMETERS):

§ 參數(被顯式設置的初始化參數)

§ 值

會話字符集環境NLS_SESSION_PARAMETERS:

§ 參數(session parameters)

§ VALUE

V$NLS_VALID_VALUES(顯示NLS data boot file,包括可能不支持的或者外部用的定義)

§ Parameter(language,sort,territory,characterset)

§ VALUE


Tags: 漢字編碼 少數民族 阿拉伯 服務器 Oracle

文章來源:


ads
ads

相關文章
ads

相關文章

ad