>進入 1. 字符集與編碼常識 字符集: 人們根據需要把某些字符收集到一處,并賦以名稱,于是便有了某某字符集。 例如: ASCII: ASCII字符集:包含大小寫英文、阿拉伯數字、標點,以及一些不可見的控制符共1" />
歡迎進入Oracle社區(qū)論壇,與200萬技術人員互動交流 >>進入 1. 字符集與編碼常識 字符集: 人們根據需要把某些字符收集到一處,并賦以名稱,于是便有了某某字符集。 例如: ASCII: ASCII字符集:包含大小寫英文、阿拉伯數字、標點,以及一些不可見的控制符共1
歡迎進入Oracle社區(qū)論壇,與200萬技術人員互動交流 >>進入
1. 字符集與編碼常識
字符集:
人們根據需要把某些字符收集到一處,并賦以名稱,于是便有了某某字符集。
例如:
ASCII:
ASCII字符集:包含大小寫英文、阿拉伯數字、標點,以及一些不可見的控制符共128個。
ASCII編碼:使用7位表示一個字符。編碼范圍是[0-127](即Hex[00-7F]),其中[0-31](Hex[00-1F])部分以及127(Hex7F)是控制符,其余的都是些可見字符。
GB2312:
GB2312字符集:ASCII字符集+7000左右漢字字符。
GB2312編碼:兼容ASCII編碼。對字節(jié)進行判斷,如值<=127,則意義等同于ASCII編碼;如值>127,則它需要跟其后的另一個字節(jié)合并表示一個字符。其理論漢字編碼空間為128X256,超過3萬個字符。
GBK:
GBK字符集:GB2312字符集+20000左右漢字字符。
GBK編碼:兼容GB2312編碼。利用了GB2312編碼閑置的編碼空間。
GB18030:
GB18030字符集:GBK字符集+若干漢字+若干少數民族字符,為目前國內最新的字符集。
GB18030編碼:兼容GBK編碼。繼續(xù)利用GBK編碼閑置的編碼空間,對于超出編碼空間的則采用4個字節(jié)表示。
BIG5:
BIG5字符集:ASCII字符集+13000左右漢字(繁體)。
BIG編碼:兼容ASCII編碼。其編碼模式類似于GB2312.
UNICODE:(UNICODE一詞在日常使用中顯得寬泛、混亂,在不同的語境中可以是以下意思之一。)
UNICODE標準:由一些組織提出的一套標準,對人類文字的顯示、編碼等進行了一系列的規(guī)定。
UNICODE字符集:目前最新版的UNICODE字符集中已經包含各種語言的超過10萬的字符。
UNICODE編碼:(狹義的UNICODE編碼可能指UCS-2,也可能指UTF-16;廣義的UNICODE編碼可以指包括以下四種在內的若干種對UNICODE標準的編碼實現。)
1. UTF-32編碼:固定使用4個字節(jié)來表示一個字符,存在空間利用效率的問題。
2. UTF-16編碼:對相對常用的60000余個字符使用兩個字節(jié)進行編碼,其余的(即'補充字符supplementary characters')使用4字節(jié)。
3. UCS-2編碼:是對UNICODE早期版本的實現,它與UTF-16的唯一區(qū)別是它不包括'補充字符',所以它對字符的編碼只使用兩個字節(jié)。目前此編碼模式已過時。
4. UTF-8編碼:兼容ASCII編碼;拉丁文、希臘文等使用兩個字節(jié);包括漢字在內的其它常用字符使用三個字節(jié);剩下的極少使用的字符使用四個字節(jié)。
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實際上是一系列的編碼集合,根據操作系統區(qū)域設置而激活其中一種作為默認ANSI編碼。例如公司電腦(英文系統)上的ANSI code page可能是1252,而家里的中文系統則可能是936.所以在家里可以用ANSI存儲一個包含中文的文本文件,在公司則不行??梢栽谧员礞I:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NLS\CodePage\ACP中查看到當前使用的ANSI code page. C#可以通過Encoding.Default查看。
OEM code pages: OEM code pages是給控制臺應用程序(如SQLPLUS)使用的。除CJK環(huán)境(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
§ 單字節(jié)字符集:
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)
§ 變長多字節(jié)字符集:例如Japanese Extended UNIX Code(JEUC)、ChineseGB2312-80(GB2312-80)、AL32UTF8(UTF-8)
§ 定長多字節(jié)字符集:只有National Character Set(AL16UTF16)是定長多字節(jié)字符集,是2個字節(jié)的Unicode編碼
§ Unicode(AL32UTF8,AL16UTF16,UTF8):Oracle使用AL32UTF8、UTF8、UTFE作為數據庫字符集,使用AL16UTF16和UTF8作為國家語言字符集。
2.2. 數據庫字符集與國家字符集比較
為什么要有兩個字符集?如果我知道只需要英文,設置數據庫字符集=US7ASCII,如果我知道只需要西歐字符,設置數據庫字符集=WE8MSWIN1252或者WE8ISO89859P1,或者干脆就用AL32UTF8.你看,我只需要設定"數據庫字符集",那么"國家字符集"有什么必要呢?
其實,考慮到歷史遺留問題以及數據庫創(chuàng)建者們無法避免的"短視",很多現有數據庫都無法支持UNICODE字符集,例如要在現有的US7ASCII數據庫字符集的數據庫中存儲中文,這個時候"國家字符集"+NVARCHAR2這樣的組合就能救你一命了。對于數據類型為NVARCHAR2(以及NCHAR, NCLOB)的字段,它使用是國家字符集,與數據庫字符集的設置無關。自9i以后,國家字符集可選的只有AL16UTF16與AL32UTF8,UTF-16與UTF-8都是UNICODE編碼標準的實現,因些可以表示世界上幾乎所有的文字。
當然,如果數據庫字符集本身就使了UNICODE字符集,就沒有必要使用NVARCHAR2, NCHAR, NCLOB這些類型了。
數據庫字符集與國家字符集比較:
數據庫字符集
國家字符集
在創(chuàng)建時定義
在創(chuàng)建時定義
不重建不能再改變
除了一些例外,不重建不能再改變
用char、varchar2、clob、long存放數據列
用NCHAR、NVARCHAR2、NCLOB存放數據列
可以存放變長字符集
可以使用AL16UTF16或者UTF8存放Unicode
Oracle對字符集的命名實際上有一定的規(guī)則可尋,例如:
AL32UTF8
【AL】支持所有語言(All Language)。
【32】每字符最多占用32位(4字節(jié))。
【UTF8】編碼為UTF-8.
WE8MSWIN1252
【WE】支持西歐語言(Western Europe)。
【8】每字符需要占用8位(單字節(jié))。
【MSWIN1252】編碼為CP1252.
US7ASCII
【US】表示美國(United States)。
[1] [2] [3]
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com