varchar2 类型「建议收藏」
1 、varchar2 在數(shù)據(jù)庫表中的最大長度是4000 bytes or character,在 oracle plsql varchar2最大支持長度為32767個字節(jié)
SQL> declare
  2 v_var varchar2(32767);
  3 begin
  4 null;
  5 end;
  6 /
PL/SQL 過程已成功完成。
SQL> declare
  2 v_var varchar2(32768);
  3 begin
  4 null;
  5 end;
  6 /
  v_var varchar2(32768);
  *
 第 2 行出現(xiàn)錯誤:
 ORA-06550: 第 2 行, 第 22 列:
 PLS-00215: 字符串長度限制在范圍 (1…32767) 
SQL> declare
  2 v_var varchar2(32767 byte);
  3 v_char varchar2(32767 char);
  4 begin
  5 v_var := lpad(‘a’,32767,’a’);
  6 dbms_output.put_line(length(v_var));
  7 v_char := lpad(‘中’,32767,’中’);
  8 dbms_output.put_line(lengthb(v_var));
  9 v_var := lpad(‘中’,32768,’中’);
 10 end;
 11 /
 declare
 *
 第 1 行出現(xiàn)錯誤:
 ORA-06502: PL/SQL: 數(shù)字或值錯誤 : 字符串緩沖區(qū)太小
 ORA-06512: 在 line 9
2 、索引的長度有限制
SQL> create table t ( a varchar2(4000), b varchar2(4000));
表已創(chuàng)建。
SQL> create index i on t(a,b);
 create index i on t(a,b)
  *
 第 1 行出現(xiàn)錯誤:
 ORA-01450: 超出最大的關(guān)鍵字長度 (6398)
3、
ORACLE中VARCHAR2類型的字段長度是按照byte來定義的。如果數(shù)據(jù)庫使用的字符集是GBK,GB2312或者其他定長字符集的話,這個問題似乎可以被忽略,因為只要把數(shù)據(jù)庫的字段長度/2就可以得到你要限制插入該字段的中文長度了。 但是,如果數(shù)據(jù)庫的字符集是UTF-8呢,杯具了吧,人家是變長的。
其實人家ORACLE沒這么笨,本來就可以用字符為單位來定義varchar2的長度的,這個時候需要注意在建表時這樣寫:createtable ABC_TABLE (A_FIELD varchar2(20 char))
這個varchar2(2 char)就表示了是用字符為單位來定義了,而默認(rèn)情況下的varchar2(2)這樣就是字節(jié)!
SQL> create table AB (A varchar2(2 char)) ;
表已創(chuàng)建。
SQL> insert into ab values(‘如果’);
已創(chuàng)建 1 行。
SQL> commit;
提交完成。
SQL> select *From ab;
A
 —-
 如果
SQL> create table ABc (A varchar2(2)) ;
表已創(chuàng)建。
SQL> insert into abc values(‘如果’);
 insert into abc values(‘如果’)
  *
 第 1 行出現(xiàn)錯誤:
 ORA-12899: 列 “SCOTT”.”ABC”.”A” 的值太大 (實際值: 4, 最大值: 2)
如果你不確定數(shù)據(jù)庫里究竟是怎么定義,你想找出所有采用字節(jié)定義長度的字段,
select * from user_tab_columnswhere CHAR_USED=‘B’
這里的CHAR_USED的意思是:如果是字符定義-‘C’,字節(jié)定義-‘B’
4VARCHA2可能導(dǎo)致的問題是行遷移。
如果varchar2列被修改,而且修改后數(shù)據(jù)長度增大,這會引起‘行遷移’(Row Migration),造成多余的I/O。主要影響:行遷移和行鏈接,直接導(dǎo)致數(shù)據(jù)讀取和寫入IO增多
5 varhcar2和char的區(qū)別
SQL> create table t( a varchar2(3),b char(3));
表已創(chuàng)建。
SQL> insert into t values(‘a’,’a’);
已創(chuàng)建 1 行。
SQL> commit;
提交完成。
SQL> select *From t;
A B
 — —
 a a 
SQL> select dump(a),dump(b) from t;
DUMP(A)
 ——————————————————————————–
 DUMP(B)
 ——————————————————————————–
 Typ=1 Len=1: 97
 Typ=96 Len=3: 97,32,32
從dump中可以看出varchar2的存儲長度是1,而char類型的長度是3,其余空間被空格填充;
參考:http://doingwell.iteye.com/blog/972938
http://www.linuxidc.com/Linux/2012-03/56006.htm
總結(jié)
以上是生活随笔為你收集整理的varchar2 类型「建议收藏」的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 优先队列详解(转载)
- 下一篇: [solr] - solr5.2.1环境
