我們都知道Oracle字符集有N多種,最初我們應用比較廣泛的字符集是ASCII,但是因為ASCII所支持的相關字符是很有限的,因此又相繼出現了很多的編碼方案,這些編碼方案大部分都是包括了ASCII的。EBCDIC編碼是另一個比較基本的編碼,它的部分字符采用了和ASCII不同的編碼值,因此兩者是不兼容的基本編碼方案。
采用EBCDIC編碼的比較少,目前主要是IBM 的系統采用,如AS400及S390系統,大部分的系統都是基於ASCII編碼的。
由於亞洲國家的Oracle字符集相對復雜一些,因此一般都使用了兩個及以上的字節進行編碼的方案。對於簡體中文,GB2312碼是國家1981年實施的編碼標准,通行於大陸。新加坡等地也使用此編碼。GBK編碼是GB2312碼的擴展,是1995年發布的指導性規范,它在字匯一級支持 ISO/IEC 10646-1 和GB 13000-1 的全部中日韓 (CJK) 漢字(20902字)。
目前最新的漢字字符集是2000年的GB18030,它是取代GBK1.0的正式國家標准。該標准收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。目前簡體Windows的缺省內碼還是GBK。
由於編碼方案太多且彼此之間不兼容,存在互相之間存在沖突的情況,即對於同一個編碼數值,在兩種不同的編碼方案中代表的是兩個不同的字符。這樣對於一些WEB應用來說,由於多種語言文字的同時使用及存儲,需要采用一種統一的字符集。
為此,國際標准化組織(ISO)制定了ISO 10646碼表,而Unicode協會制定了Unicode規范,這兩個體系剛開始時是獨立建立的,在1991年,雙方都認識到世界不需要兩個不兼容的Oracle字符集。於是它們開始合並雙方的工作成果,並為創立一個單一編碼表而協同工作。
從Unicode2.0開始,Unicode項目采用了與ISO 10646-1相同的字庫和字碼。目前兩個項目仍都存在,並獨立地公布各自的標准。Unicode協會現在的最新版本是2006年的Unicode 5.0。
Oracle數據庫的字符集
Oracle的字符集名字一般由以下部分組成:語言或區域、表示一個字符的比特位數、標准字符集名稱(可選項,S或C,表示服務器或客戶端)。Oracle字符集UTF8與UTFE不符合此規定,其它基本都是這種格式。
- set nls_lang=AMERICAN_AMERICA.UTF8
- set nls_lang=SIMPLIFIED CHINESE_AMERICA.UTF8
對於US7ASCII,表示區域是US,用7個比特位表示一個字符,標准的字符集名稱為ASCII。
對於中文字符集ZHS16GBK,表示簡體中文(ZHT為繁體中文),一個字符需要16位比特,標准的字符集名稱為GBK。而ZHS16CGB231280表示簡體中文,一個字符需要16位比特,標准的字符集名稱為GB231280,屬於我們前面提過的1981年發布的GB2312-80標准。
雖然我們說,GBK編碼標准是GB2312編碼標准的擴展,但是數據庫字符集ZHS16GBK與ZHS16CGB231280之間卻不是嚴格的超集與子集的關系,主要是有些漢字的編碼在兩個Oracle字符集中的數值是不同的,因此它們進行字符集轉換時會出現問題。
在本文中,有時候使用的是標准字符集名稱,有時候又需要使用Oracle字符集的名稱,因此希望大家明白兩者之間的對應關系。
Oracle數據庫有國家字符集(national character set)與數據庫字符集(database character set)之分。兩者都是在創建數據庫時需要設置的。
國家字符集主要是用於NCHAR、NVARCHAR、NCLOB類型的字段數據,而數據庫字符集使用很廣泛,它用於:CHAR、VARCHAR、CLOB、LONG類型的字段數據;表名、列名、PL/SQL中的變量名;輸入及保存在數據庫的SQL和PL/SQL的源碼。
Oracle支持的Unicode字符集有以下幾種,下面的列表給出了字符集的名稱、對應的數據庫版本范圍、采用的Unicode的版本。
AL24UTFFSS:是Oracle第一種支持Unicode的Oracle字符集,從7.2版本開始使用,但是它支持的Unicode版本為1.1,因此從9i開始就不支持此字符集了。
UTF8:是Oracle從Oracle8開始使用的屬於UTF-8編碼的字符集,從Oracle8.0到Oracle8.16,Unicode版本為2.1,而Oracle817到10g,采用的Unicode標准為3.0
UTFE:用於EBCDIC碼平台上的數據庫Unicode字符集。因此它屬於專用系統使用的字符集,其它屬性與UTF8基本相同。
AL32UTF8:是從Oracle9開始使用的屬於UTF-8編碼的字符集,與UTF8相比,它采用的Unicode版本更新,在10g版本中使用的是Unicode 4.01標准,而UTF8因為兼容性的考慮,在10g版本中用的是Unicode 3.0標准。
AL16UTF16:是Oracle第一種采用UTF-16編碼方式的字符集,從Oracle9開始使用,是作為缺省的國家字符集使用,它不能被用作數據庫的字符集。
這是因為數據庫的字符集決定了SQL與PL/SQL源碼的編碼方式,對於UTF-16這種使用固定的兩個字節來表示英文字母的編碼方案來說,確實不適於用作數據庫的Oracle字符集,Oracle目前采用的數據庫字符集都是基於ASCII或EBCDID作為子集的編碼方案。