教你如何成為Oracle 10g OCP - 第二十一章 全球化支援

tolywang發表於2010-10-20


國家語言支援


Oracle10g提供了100多種語言和30多種字符集。


21.1  字符集

定義 :  字符集指的是對字元進行編碼的方案。 對於我們看到的所有字元,比如'A',並不是
直接將A存放在資料檔案中,而是將其轉換為一組數字,然後將這些數字轉換為二進位制儲存。

最早的編碼ASCII : 美國資訊交換標準碼(American Standard Code for Information Interchange),
方案中每個英文字母和其他特殊字元都指定了相應的一組編碼。

在Oracle中出現的最早的字符集是US7ASCII, 用來支援ASCII編碼方案,該字符集用單個
位元組(Byte)中的7個bit位來描述一個字元(1Byte=8bit),那麼總共可以表示的字元是128
個(2的7次方,0和1組成7位),這在美國本土夠用,但是在世界其他範圍就不夠了。

隨後Oracle中又出現了8個bit的字符集,也屬於單位元組字符集,可用字元升級到256個,比如
WE8ISO8859P1, 這是在西歐國家使用的,符合ISO標準的編碼。

但是在東歐和一些亞洲國家,還是不夠用,比如中國漢字超過55000個,因此Oracle字符集
中又出現了多位元組字符集,多位元組字元包含兩種型別:

1.  固定長度的位元組數表示一個字元,10g中支援固定長度的多位元組字符集只有1個:AF16UTF16,
主要用於國家字符集。
2.  變化長度的多位元組字符集,採用1到3個位元組(Byte)來表示一個字元,某些字元比如英文
字母,用一個位元組表示, 而其它字元用2個或多個位元組表示,變長多位元組字元多用來表示亞洲
國家語言,比如中文,日文等,這些字符集包括ZHS16GBK、AL32UTF8 (AL=ALL,表適用所有語言) 。

 


Unicode 編碼方案 --

uni=unique , unicode 表示要推廣為全世界每一個字元提供唯一的編碼的方案,包括UTF-16,
它是unicode的16位編碼方案,是固定長度的多位元組編碼方案,用2個位元組,表示一個unicode
字元,在資料庫中AF16UTF16就是實現UTF-16編碼方案的字符集。

unicode編碼方案還包括UTF-8, 是8位編碼方案,是一種變化長度的多位元組編碼方案,可以使
用1到3個位元組來表示一個unicode字元。 資料庫中AL32UTF8, UTF8就是實現UTF-8編碼方案的字
符集。UTF-8又稱萬國碼。 它對英文使用8位(即一個位元組),中文使用24為(三個位元組)來
編碼。

UTF是 Unicode Translation Format;unicode是一種編碼方式,和ascii是同一個概念,
而UTF是一種儲存方式(格式)。

 

-------------------------------------------

什麼是UTF-8?它與UNICODE是一回事嗎?

  Unicode的最初目標,是用1個16位的編碼來為超過65000字元提供對映。但這還不夠,
它不能覆蓋全部歷史上的文字,也不能解決傳輸的問題(implantation head-ache's),
尤其在那些基於網路的應用中。已有的軟體必須做大量的工作來程式16位的資料。

  因此,Unicode用一些基本的保留字元制定了三套編碼方式。它們分別是UTF-8,UTF-16
和UTF-32。正如名字所示,在UTF-8中,字元是以8位序列來編碼的,用一個或幾個位元組
來表示一個字元。這種方式的最大好處,是UTF-8保留了ASCII字元的編碼做為它的一部分,
例如,在UTF-8和ASCII中,“A”的編碼都是0x41.

  UTF-16和UTF-32分別是Unicode的16位和32位編碼方式。考慮到最初的目的,通常說
的Unicode就是指UTF-16。在討論Unicode時,搞清楚哪種編碼方式非常重要。Unicdoe相
關的技術介紹參見.

-------------------------------------------

 

 

21.2  資料庫字符集

資料庫包括兩個字符集: 資料庫字符集和國家字符集,都是在建立資料庫時指定的,我們
主要使用資料庫字符集,國家字符集則是對資料庫字符集的補充。有關資料庫自帶的PL/SQL
程式包以及SQL語句等,都必須以能相容單位元組的編碼方式來存放。因此如果資料庫中需要
使用固定長度的多位元組字元的話,則不能相容單位元組的編碼方式。因此為了能支援固定長度
的多位元組字元,我們可以將該字符集(固定長度的多位元組字元)指定為國家字符集 。


--------------------------------------------------------------
備註:
我們在DBCA建立資料庫的時候,一般資料庫字符集會選擇使用 Unicode (AL32UTF8),
變化長度的多位元組編碼方案, 這相容上面講到的單位元組的編碼方式; 國家字符集
選擇AL16UTF16 - Unicode UTF-16 通用字符集(固定長度的多位元組字元) . 
--------------------------------------------------------------

資料庫字符集 ---

Oracle 資料庫對以下項使用資料庫字符集:
A.  以 CHAR 資料型別 (CHAR、VARCHAR2、CLOB 和 LONG) 儲存的資料
B.  識別符號,如表名、列名和 PL/SQL 變數
C.  輸入並儲存 SQL 和 PL/SQL 程式原始碼


國家字符集  ---

國家字符集是一個備用字符集,利用此字符集可以在沒有Unicode 資料庫字符集的資料庫
中儲存 Unicode 字元。選擇國家字符集的其它原因如下:
A. 對於頻繁的字元處理操作,不同的字元編碼方案可能更為理想
B. 使用國家字符集時程式設計更容易
如果表的列的資料型別定義為NCHAR, NVARCHAR2, NCLOB等,則其中存放的資料使用
國家字符集進行編碼。


透過 nls_database_parameters 檢視當前資料庫字符集和國家字符集。一旦建立了資料庫,
就不應該再修改字符集。修改字符集的命令:
SQL> alter database character set  ;
也可以透過 PROPS$ 檢視字符集 。

 


21.3  客戶端字符集

透過設定環境變數來定義客戶端的字符集
NLS_LANG=_.

例子:
C:\> set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
說明語言為簡體中文,區域為中國,字符集為ZHS16GBK

檢視v$nls_valid_values 裡記錄了可以為language,territory及客戶端字符集所設定的
合法值。

在Windows中可以透過修改登錄檔來指定客戶端的字符集資訊。
HKEY_LOCAL_MACHINE\\SOFTWARE\\Oracle\\HOME0
如果在unix或Linux下面可以透過export方式設定:
$export  NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
我們在客戶端登陸到資料庫後,session相關的語言環境由客戶端的nls_lang進行設定。
我們可以透過alter session set 來覆蓋nls_lang的設定。


備註: nls_language是伺服器端的屬性,nls_lang是客戶端的屬性

 

 

21.4  客戶端字符集與伺服器端字符集的轉換


先了解一下超集和子集的關係: 
http://space.itpub.net/35489/viewspace-676403
顯示為"靠","?" 或者 顛倒過來的 "?" 的原因分析:
http://lastwinner.itpub.net/post/7102/45628 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-676406/,如需轉載,請註明出處,否則將追究法律責任。

相關文章