字元型別的字元儲存與位元組儲存

呆呆笨笨的魚發表於2014-05-26
Oracle中儲存字元常用的資料型別有char和varchar2
其中
char 是定長,最小為1,最大為2000

varchar2 是變長,最小為1,最大為4000

在使用過程中,常見的定義
col char(n)  --位元組儲存的預設形式
col char(n byte)   --位元組儲存
col char(n char)   --字元儲存

col varchar2(n)  --位元組儲存的預設形式
col varchar2(n byte)   --位元組儲存
col varchar2(n char)   --字元儲存

位元組儲存表示最長能儲存n個位元組的字串。

字元儲存表示最長能儲存n個字元的字串。

例:
建立表t_char
create table t_char
(col_a char(5)
,col_b char(5 char)
);

插入記錄
SQL> insert into t_char values ('aaaa','aaaa');
 
1 row inserted
 
檢視錶兩個欄位的位元組長度和字元長度
SQL> select length(col_a),length(col_b) from t_char;
 
LENGTH(COL_A) LENGTH(COL_B)
------------- -------------
            5             5
 
SQL> select lengthb(col_a),lengthb(col_b) from t_char;
 
LENGTHB(COL_A) LENGTHB(COL_B)
-------------- --------------
             5              5  
             
char是定長,所以佔用的位元組和字元一定是固定的。

插入第二條記錄
SQL> insert into t_char values ('bbb11','bbb11');
 
1 row inserted

由於使用的是字母和數字組合的值,即滿足5個位元組又滿足5個字元,能插入,看不出兩個欄位的區別。
下面使用中文,如果值為'資料庫',會出現什麼情況?

insert into t_char values ('資料庫','資料庫')
 
ORA-12899: 列 "SCOTT"."T_CHAR"."COL_A" 的值太大 (實際值: 6, 最大值: 5)

報錯!col_a char(5) 位元組長度最大為5,三個中文字元6位元組超長。

所以col_a char(5) 位元組長度定義 與 col_b char(5 char) 字元長度定義的區別如下
SQL> insert into t_char values ('資料1','我愛資料庫');
 
1 row inserted

檢視插入值的字元長度
SQL> select length('資料1'),length('我愛資料庫') from dual;
 
  LENGTH('資料1')      LENGTH('我愛資料庫')
--------------- --------------------
              3                    5
檢視插入值的位元組長度
SQL> select lengthb('資料1'),lengthb('我愛資料庫') from dual;
 
  LENGTHB('資料1')      LENGTHB('我愛資料庫')
---------------- ---------------------
               5                    10            
col_b char(5 char)表示最長能儲存5個字元,包括中文字元,如果5個字元都是中文字元,位元組長度佔10個位元組(字符集GBK)
 
varchar型別的定義也是類似的,不再贅述

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28929558/viewspace-1169961/,如需轉載,請註明出處,否則將追究法律責任。

相關文章