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