ORACLE DB 的學習者們

2015年5月29日 星期五

關於ORACLE的字元型態和其長度

資料庫儲存字元的常用型態有CHAR 與 VARCHAR2

而在使用這兩個型態的時候

常常很難決定到底要不要加上單位?

定義 varcha2(30) ,varchar2(30 byte),還是varchar2(30 char)

哪種方式長度才夠? 尤其我們必須處理中文字的時候就很捆擾

在資料庫中,有一個參數 NLS_LENGTH_SEMANTICS

就定義,如果不加上長度單位的時候,那預設的單位為何

(可以用以下SQL去查詢你的定義為何:

select * from v$parameter where name like '%nls_length%'; )

如果不去特別定義,這個參數的預設值是 BYTE

要注意

每個中文字元長度佔 3 bytes

每個英數字長度佔 1 bytes

所以在定義欄位長度時,如果是varchar2

建議使用 char 當作欄位長度的單位

如果不用任何長度單位,那會使用系統預設值,也就是 byte

所以如果定義任何一個欄位長度為 varchar2(3 char)

那它就可以儲存三個中文字

如果定義為 varchar2(3) 則長度為 3 bytes

也就是說,只能儲存一個中文字

幾個常見的字元函數傳回值的型態要注意

length ==>傳回的長度,以char為單位 所以 length('中文字') = 3

lengthb ==>傳回的長度,以byte為單位 所以 length('中文字') = 9

substr 以CHAR為單位,所以 substr('中文字',1,2),傳回 '中文'

substrb 以BYTE為單位,所以 substrb('中文字',1,6),傳回 '中文'

至於資料型態 CHAR 與 VARCHAR2 的根本差異

要注意前者是固定長度字串

後者是變動長度字串

前者,在儲存資料時,會將長度不足之處補上空白

例如,假如宣告char(3),而儲存的字串是'NO',則在DB裡面會儲存 'NO ',包含一個空白字元

而且在比較的時候,也會把那個空白字元一起拿來比較

後者,varchar2,則是變動長度字串

後者,在儲存資料的時候,不會補上空白字元

在比較的時候,也不會把字元後面的空白拿來一起比

所以,如果宣告varchar2(3),而儲存的長度是'NO',則在DB裡面會儲存 'NO',不含空白字元