而在使用這兩個型態的時候
常常很難決定到底要不要加上單位?
定義 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',不含空白字元