syscolumns表collength列取值

  syscolumns表中的collength值取决于列的数据类型。

1. 基于整数的数据类型

  BIGINT、BIGSERIAL、DATE、INTEGER、INT8、SERIAL、SERIAL8 或 SMALLINT 列的 collength值与计算机无关。数据库服务器对这些基于整数的数据类型使用以下长度。

基于整数的数据类型 长度( bytes)
SMALLINT 2
DATE, INTEGER, SERIAL 4
INT8 ,SERIAL8 10
BIGINT, BIGSERIAL 8

2. 可变长度字符数据类型

  对于LVARCHAR类型, collength存储该数据类型定义时声明的最大值,如果未指定最大值,则默认最大值2048。
  对于 VARCHAR(max_size,min_space)NVARCHAR(max_size,min_space) 列,使用max_size和min_space值通过以下公式之一来计算列长:

  • 如果 collength值为正数:
    collength = (min_space * 256) + max_size

  • 如果 collength值为负数:
    collength + 65536 = (min_space * 256) + max_size

3. 时间数据类型

  如前所述,DATE 列的 collength值为 4。
  对于DATETIMEINTERVAL列,collength通过以下公式进行计算:

(length * 256) + (first_qualifier * 16) + last_qualifier

  DATETIMEINTERVAL字段的实际长度,first_qualifier和last_qualifier具有下表显示的值。

字段限定符 字段限定符
YEAR 0 FRACTION(1) 11
MONTH 2 FRACTION(2) 12
DAY 4 FRACTION(3) 13
HOUR 6 FRACTION(4) 14
MINUTE 8 FRACTION(5) 15
SECOND 10

例如: DATETIME YEAR TO MINUTE字段的length为12(YYYY:DD: MO:HH:MI) , first_qualifier即YEAR值为0, last_qualifier即MINUTE值为8,所以 collength=(12256)+(016)+8=3080

4. 定点数据类型

  定点数据类型 MONEY或DECIMAL(p,s )的collength使用以下公式计算:

(precision * 256) + scale

5. 简单大对象数据类型

  对于简单大对象 BYTE或者TEXT,collength 保存描述符的长度。

6. 测试

$dbaccess testdb -

Database selected.

> create table tcollength( 
> c1 smallint,
> c2 int,
> c3 int8,
> c4 bigint,
> c5 date,
> c6 lvarchar,
> c7 lvarchar(3000),
> c8 varchar(30,10),
> c9 nvarchar(30,10),
> c10 datetime year to second,
> c11 decimal(10,3),
> c12 text
> );

Table created.

> select tabid from systables where tabname='tcollength';


      tabid 

        587

1 row(s) retrieved.

> select colname,coltype,collength from syscolumns where tabid=587;

1694768333692