GBase 8s 系统表syscolumns字段说明
syscolumns表结构
系统表syscolumns保存的是表的字段信息。其包含的主要字段如下:
字段名称 | 字段类型 | 说明 |
---|---|---|
colname | VARCHAR(128) | 字段名称 |
tabid | INTEGER | 该字段所属的表的唯一ID |
colno | SMALLINT | 字段编号(表内) |
coltype | SMALLINT | 字段的数据类型(数字形式) |
collength | 对不同的数据类型有不同解释: 基本数值类型 可变长字符型 时间类型 定点数据类型 简单大对象 IDSSECURITYLABEL | 取决于数据类型 |
colmin | INTEGER | 最小字段长度(单位:字节) |
colmax | INTEGER | 最大字段长度(单位:字节) |
extended_id | INTEGER | 从系统表sysxtdtypes而来的数据类型编码 |
seclabelid | INTERGER | 总是NULL |
colattr | SMALLINT | 字段属性: HIDDEN: 1 - 隐藏字段 ROWVER: 2 - 行版本字段 ROW_CHKSUM: 4 - 行键字段 ER_CHECKVER: 8 - ER行版本字段 UPGRD1_COL:16 - ER自动主键字段 UPGRD2_COL: 32 - ER自动主键字段 UPGRD3_COL: 64 - ER自动主键字段 PK_NOTNULL: 128 - 主键非空 |
说明:在tabid和colno上建有复合主键。
coltype类型
coltype值 | 对应16进制值 | 对应的数据类型 |
---|---|---|
0 | 0x0 | CHAR |
1 | 0x1 | SMALLINT |
2 | 0x2 | INTEGER |
3 | 0x3 | FLOAT |
4 | 0x4 | SMALLFLOAT |
5 | 0x5 | DECIMAL |
6 | 0x6 | SERIAL |
7 | 0x7 | DATE |
8 | 0x8 | MONEY |
9 | 0x9 | NULL |
10 | 0xa | DATETIME |
11 | 0xb | BYTE |
12 | 0xc | TEXT |
13 | 0xd | VARCHAR |
14 | 0xe | INTERVAL |
15 | 0xf | NCHAR |
16 | 0x10 | NVARCHAR |
17 | 0x11 | INT8 |
18 | 0x12 | SERIAL8 |
19 | 0x13 | SET |
20 | 0x14 | MULTISET |
21 | 0x15 | LIST |
22 | 0x16 | ROW(未命名) |
23 | 0x17 | COLLECTION |
40 | 0x28 | 可变长度不透明类型 |
41 | 0x29 | 固定长度不透明类型 |
43 | 0x2b | LVARCHAR(仅适用于客户机端) |
45 | 0x2d | BOOLEAN |
52 | 0x34 | BIGINT |
53 | 0x35 | BIGSERIAL |
2061 | 0x80d | IDSSECURITYLABEL |
4118 | 0x1016 | ROW(命名) |
coltype代码可通过叠加位值显示列的以下特征。
位值 | 设置位时的有效值 |
---|---|
0x0100 | 不允许使用 NULL 值 |
0x0200 | 值来自主变量 |
0x0400 | 用于联网的数据库服务器的点分十进制 |
0x0800 | DISTINCT 数据类型 |
0x1000 | 命名 ROW 类型 |
0x2000 | VARCHAR 基本类型中的 DISTINCT 类型 |
0x4000 | BOOLEAN 基本类型中的 DISTINCT 类型 |
0x8000 | 在客户机系统上处理的集合 |
如:
包含NOT NULL属性的varchar类型的coltype的值是269,是十六进制值0x10d的十进制表示法,该十六进制值是0xd(varchar类型)与0x100(不允许使用NULL值)的叠加。
命名行类型的 coltype 值 4118,是十六进制值 0x1016 的十进制表示法,该十六进制值与设置了命名行类型位的未命名行类型 0x16 的十六进制 coltype 值相同。
文件 $GBASEDBTDIR/incl/esql/sqltypes.h 包含有关 syscolumns.coltype 代码的其他信息。
NOT NULL 约束
如上面所述:如果列不允许使用 NULL 值,那么 coltype 值将增加 256。要确定这种列的数据类型,根据可能的 coltype 值,从值中减去 256 并求余数。例如,如果 coltype 值为 262,减去 256 得到余数 6,那么这表示列具有 SERIAL 数据类型。
不透明数据类型
特定数据类型是由数据库服务器作为内置不透明数据类型来实现的。内置不透明数据类型的类型定义由数据库服务器提供。
内置不透明类型没有唯一的 coltype 值。相反,coltype 值基于不透明类型的类别。以下表列出内置不透明数据类型的 coltype 值:
不透明数据类型的类别 | 预定义数据类型 | coltype 列的值 |
---|---|---|
固定长度不透明类型 | BLOB、BOOLEAN 和 CLOB | 41 |
长度可变的不透明类型 | LVARCHAR、JSON 和 BSON | 40 |
VARCHAR(128) 的 DISTINCT | IDSSECURITYLABEL | 2061 |
使用 sysxtdtypes 系统目录表中的 extended_id 列来区分不同的固定长度不透明类型。
存储列长度
collength 列值取决于列的数据类型。
基于整数的数据类型
BIGINT、BIGSERIAL、DATE、INTEGER、INT8、SERIAL、SERIAL8 或 SMALLINT 列的 collength 值与机器无关。 数据库服务器对 SQL 语言的这些基于整数的数据类型使用以下长度。
基于整数的数据类型 | 长度(以字节计) |
---|---|
SMALLINT | 2 |
DATE、INTEGER 和 SERIAL | 4 |
INT8 和 SERIAL8 | 10 |
BIGINT 和 BIGSERIAL | 8 |
可变长度字符数据类型
对于 LVARCHAR 类型的列,collength 具有来自数据类型声明的 max 值或 2048(如果没有指定最大值)。
对于 VARCHAR 或 NVARCHAR 列,max_size 和 min_space 值是使用以下某个公式编码在 collength 列中:
如果 collength 值是正的:
collength = (min_space * 256) + max_size
如果 collength 值是负的:
collength + 65536 = (min_space * 256) + max_size
注意
在3.0版本之后,该规则变更为:
如果 collength值是正的:
collength = (min_space * 65536) + max_size
如果 collength值是负的:
collength + 4294967296= (min_space * 65536) + max_size
时间数据类型
如前面所述,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 列长度为 12(例如:YYYY:DD:MO:HH:MI),first_qualifier 值为 0(用于 YEAR),并且 last_qualifier 值为 8(用于 MINUTE),那么 collength 值为 3080(由 (12 * 256) + (0 * 16) + 8 计算所得)。
定点数据类型
MONEY 或 DECIMAL(p,s) 列的 collength 值可使用以下公式来计算:
(precision * 256) + scale
简单大对象数据类型
如果列的数据类型为 BYTE 或 TEXT,那么 collength 保存描述符的长度。
存储最大值和最小值
colmin 和 colmax 值分别保存该列中第二小和第二大的数据值。
例如:如果索引列中的各个值为 1、2、3、4 和 5,那么 colmin 值为 2 而 colmax 值为 4。存储第二小的数据值和第二大的数据值会让查询优化器对列中的值范围进行假设并进一步依次优化搜索策略。
仅当对列建立了索引并且 UPDATE STATISTICS 语句显式或隐式地计算了列分发时,colmin 和 colmax 列才会包含值。如果在表空间中存储 BYTE 或 TEXT 数据,那么 colmin 值会编码为 -1。
colmin 和 colmax 列仅对适合四个字节的数据类型有效:SMALLFLOAT、SMALLINT、INTEGER 以及 CHAR 的前四个字节。所有其他非整数列类型的值是最大值或最小值的头四个字节,它们被视为整数。
使用 UPDATE STATISTICS MEDIUM 比依赖于 colmin 和 colmax 值要好。UPDATE STATISTICS MEDIUM 提供了更好的信息并且对于所有数据类型都有效。
GBase 8s不计算用户定义的数据类型的 colmin 和 colmax 值。但是,如果用户定义的辅助访问方法提供了用户定义的数据类型,那么这些列具有用户定义的数据类型的值。