一个疑问不解,VARCHAR2数据类型是可变长的,就是说假设字段定义的是2000长度的VARCHAR2类型,我实际只使用了长度2,数据库是不是也不浪费空间?既然这样的话,那我为什么所有的VARCHAR2类型都设置的越大越好呢,反正可变长,反正不浪费空间,那这个VARCHAR2的长度设置还有什么意义?

解决方案 »

  1.   

    varchar2定义的长度和占用空间是没关系的,最大长度是4000
      

  2.   

    相当于规定了上限,如果对一个varchar2(2)的字段赋值'abc'会报错.可以用于规范数据
    SQL> create table t_test_varchar2
      2  (name varchar2(2));
     
    Table created
     
    SQL> 
    SQL> insert into t_test_varchar2
      2  values('abc');
     
    insert into t_test_varchar2
    values('abc')
     
    ORA-12899: value too large for column "SCOTT"."T_TEST_VARCHAR2"."NAME" (actual: 3, maximum: 2)
     
    SQL> 
      

  3.   

    --原帖来自老兵新手的回复
    由于数据库的限制(参见Logical Database Limits),每个索引的字段的总长度不能超过75% * the database block size再减去some overhead的长度,由于有限制,所以字段的长度也限制了索引字段的大小:
    SQL> create table x(
      2 a varchar2(2000),
      3 b varchar2(2000),
      4 c varchar2(2000),
      5 d varchar2(2000),
      6 e varchar2(2000));表已创建。SQL> create table y(
      2 a varchar2(10),
      3 b varchar2(10),
      4 c varchar2(10),
      5 d varchar2(10),
      6 e varchar2(10));表已创建。SQL> create index y_idx on y(a,b,c,d);索引已创建。SQL> create index x_idx on x(a,b,c,d);
    create index x_idx on x(a,b,c,d)
      *
    第 1 行出现错误:
    ORA-01450: 超出最大的关键字长度 (6398)2、字段长度能够起到一定的constraint作用,比如一个字段长度要求是10个字节,必须要设置为varchar2(10)。
    3、如果用到ARRAY FETCH,那么客户端fetch 数据需要的内存是根据定义的字段的长度,所以大的字段会需要大的内存。比如10个VARCHAR2(4000)字段,我要取100行,那么就需要 4000*10*100的内存,大约是4M,但是如果定义为VARCHAR2(10),那么就需要10*10*100的内存。