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。
对于DATETIME或INTERVAL列,collength通过以下公式进行计算:
(length * 256) + (first_qualifier * 16) + last_qualifier
DATETIME或INTERVAL字段的实际长度,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;