最近對字符集進行了相關的學習,通過查看相關書籍、在網上找找學習視頻,在此結合學習筆記對字符集做一次簡單總結。
通過一種自問自答的形式,希望可以幫助讀者對字符集的知識做一次梳理。
【不恥下問】
字符集,是字符和編碼的對應“表”,我們可以把其理解成一張對應表。之所以需要字符集,是由於計算機中只能存儲數字,我們想通過計算機獲得字符,因此采用了一個手段,讓計算機將字符對應成編碼存儲起來,這樣計算機通過查找數字編碼就可以找到相應的字符,從而實現顯示字符的目的。
1、操作系統有操作系統字符集;
2、oracle有數據庫字符集;
3、其它軟件本身所帶的字符集。
win:chcp
linux下面查看字符集:
[root@bjbank ~]# locale
locale -a//linux所支持的所有字符集
oracle下面查看字符集:
SQL> select * from v$NLS_PARAMETERS;
補充:字符集常識
zh_HK.big5hkscs:大五碼:香港用的! unicode: 國家字符集 zh_SG.gbk:國標庫 936:windows操作系統下代表中文字符集 補充完畢。
需要存儲和顯示字符的時候會用到字符集。在一個系統中,例如oracle本身自帶有字符集,因此oracle使用本身的字符集。而有些軟件是不帶字符集的,它們會選擇使用操作系統字符集。所以在判斷軟件使用的字符集是什麼的前提下,先確定軟件是使用本身自帶的字符集還是使用操作系統的字符集。
對於數據庫字符集,在數據類型的選擇上,如果不存在字符型的數據類型,可以不考慮字符集。但日常的應用系統中,數據庫中都會存在如varchar2這樣的數據類型,這是一定要用到字符集的。因為這樣的字段下用來存儲的是字符。如char、varchar2、clob、long這些都是用來存放字符的。char代表定長的,varchar2代表變長的,clob代表大對象,比如說一篇文章,long代表大對象。
另外,數據中字符集還是用來標示諸如表名、列名以及PL/SQL變量等。同時數據庫中的字符集也可以用來存儲SQL和PL/SQL程序單元等。
除了數據庫字符集以外,另外一種是國家字符集。它是用來存儲NCHAR、NVARCHAR2、NCLOB等類型數據。也就是如果數據類型為varchar2這類,數據庫會選擇數據庫字符集,如果是NVARCHAR2這類,數據庫會選擇使用國家字符集。
對於數據庫字符集和國家字符集,我們可以直觀的看一下。在oracle安裝過程中,有兩個地方涉及到設置字符集,1、數據庫字符集、2、國家字符集。如下圖:
實驗:查看數據庫的字符集?
SQL> select * from nls_database_parameters
數據庫字符集:NLS_CHARACTERSET:zhs16gbk:中文字符集
NLS_NCHAR_CHARACTERSET:國家字符集:AL16UTF16
國家字符集是作為數據庫字符集的一種補充。
字符集根據存儲字符的不同區分出不同的字符集種類,關注字符集時需要留意字符集可以存儲哪些字符。
舉幾個字符集的例子:
1、US7ASCII:只能存儲美國人使用的字符。不超過128個。ASC碼是用1個字節8位表示格式:US代表語言,7代表七位,ASCII代表編碼。
2、zhs16cgb231280:中文字符集(國標),較老的字符集,其中並未存儲完全所有中文字符。
3、zhs16gbk:最新的中文字符集。是zhs16cgb231280的超集。但不意味著嚴格超集(嚴格超集規定字符編碼是相同的才可以叫嚴格超集)。
4、utf8:屬於unicode字符集,unicode字符集是很多國家聯合起來制定的標准。用來存儲多國語言的字符集。之後推出了utf8,但並未做到unicode那樣存儲所有國家的字符集。
5、AL32UTF8:屬於unicode字符集,比較新的,比utf8范圍廣的字符集。如果要用unicode字符集就選用AL32UTF8字符集。通常對於數據庫字符集會選擇AL32UTF8。
6、AF16UTF16:屬於unicode字符集,對於國家字符集,一般統一選擇“AF16UTF16”。AF16UTF16字符集也是unicode字符集。
如果規劃數據庫會存儲中文字符,國家字符集一般選擇“AF16UTF16”。數據庫字符集設為“AL32UTF8”或“ZHS16GBK”。但是AL32UTF8字符集中,中文字符所對應的編碼會占用更多的空間。也就是說AL32UTF8字符集在性能上會差一些(雖然全,但性能會打折扣,因為會占用更大的空間意味著網絡、I/O等會有更大的負載)。因此,我們在數據庫字符集上常常選擇“ZHS16GBK”。
小結:
(1)、數據庫字符集的選擇,如果只存中文,選擇zhs16gbk,如果是國際跨國企業,選擇AL32UTF8字符集;
(2)、國家字符集選擇“AF16UTF16”。
SQL> select * from v$NLS_VALID_VALUES;
--可以查看到oracle支持499種字符集
通過以上我們可以知道,oracle支持所有字符集。
比如說oracle公司存在美國員工、中國員工、韓國員工、日本員工,需要存儲多國的語言,因此選擇unicode字符集。
對於繁體字符集分為香港和台灣兩種,香港常使用香港大五碼,台灣常使用台灣的字符集。
<語言><比特位數><編碼>
例:ZHS16GBK:中文,16位,國標庫字符集
常用字符集,參看問題5。