小弟这两天在设计数据库,在定义可变长度时有一个很弱弱的问题要请教大家。大家在定义varchar2时长度一般如何取值?为什么在定义varchar2时不直接取最大值4000呢?这样有什么不好吗?

解决方案 »

  1.   

    varchar2长度是0~32767 在表中长度最大4000字段长度大小会影响到Oracle的块大小如果你不需要考虑性能,随便用
      

  2.   

    全部用最大值4000的时候,有出现过Buffer不够大的情况,应该是楼上说的影响到块大小了
      

  3.   


    根据系统字段定义取值,比如姓名,varchar2(10)就可以了,因为很少有超过5个汉字的。
      

  4.   

    [Quote=引用楼主 unique_hxl 的回复:]
    小弟这两天在设计数据库,在定义可变长度时有一个很弱弱的问题要请教大家。大家在定义varchar2时长度一般如何取值?为什么在定义varchar2时不直接取最大值4000呢?这样有什么不好吗?
    [/Quote根据实际情况 设计长度  
      

  5.   

    即使像存储姓名之类的,我设计成varchar2长度4000,和长度20对oracle来说有什么区别?如果设计成4000和20对数据库来说完全没有区别,那么我认为设计成4000还不用考虑实际情况下应该存储多少字节内容,不是简单一点吗?
      

  6.   

    1、由于数据库的限制(参见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的内存。