GBase 8s 系统表syscolumns字段说明

syscolumns表结构

系统表syscolumns保存的是表的字段信息。其包含的主要字段如下:

字段名称字段类型说明
colnameVARCHAR(128)字段名称
tabidINTEGER该字段所属的表的唯一ID
colnoSMALLINT字段编号(表内)
coltypeSMALLINT字段的数据类型(数字形式)
collength对不同的数据类型有不同解释:
基本数值类型
可变长字符型
时间类型
定点数据类型
简单大对象
IDSSECURITYLABEL
取决于数据类型
colminINTEGER最小字段长度(单位:字节)
colmaxINTEGER最大字段长度(单位:字节)
extended_idINTEGER从系统表sysxtdtypes而来的数据类型编码
seclabelidINTERGER总是NULL
colattrSMALLINT字段属性:
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进制值对应的数据类型
00x0CHAR
10x1SMALLINT
20x2INTEGER
30x3FLOAT
40x4SMALLFLOAT
50x5DECIMAL
60x6SERIAL
70x7DATE
80x8MONEY
90x9NULL
100xaDATETIME
110xbBYTE
120xcTEXT
130xdVARCHAR
140xeINTERVAL
150xfNCHAR
160x10NVARCHAR
170x11INT8
180x12SERIAL8
190x13SET
200x14MULTISET
210x15LIST
220x16ROW(未命名)
230x17COLLECTION
400x28可变长度不透明类型
410x29固定长度不透明类型
430x2bLVARCHAR(仅适用于客户机端)
450x2dBOOLEAN
520x34BIGINT
530x35BIGSERIAL
20610x80dIDSSECURITYLABEL
41180x1016ROW(命名)

coltype代码可通过叠加位值显示列的以下特征。

位值设置位时的有效值
0x0100不允许使用 NULL 值
0x0200值来自主变量
0x0400用于联网的数据库服务器的点分十进制
0x0800DISTINCT 数据类型
0x1000命名 ROW 类型
0x2000VARCHAR 基本类型中的 DISTINCT 类型
0x4000BOOLEAN 基本类型中的 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 和 CLOB41
长度可变的不透明类型LVARCHAR、JSON 和 BSON40
VARCHAR(128) 的 DISTINCTIDSSECURITYLABEL2061

使用 sysxtdtypes 系统目录表中的 extended_id 列来区分不同的固定长度不透明类型。

存储列长度

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

基于整数的数据类型

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

基于整数的数据类型长度(以字节计)
SMALLINT2
DATE、INTEGER 和 SERIAL4
INT8 和 SERIAL810
BIGINT 和 BIGSERIAL8

可变长度字符数据类型

对于 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 具有下表所显示的值。

字段限定符字段限定符
YEAR0FRACTION(1)11
MONTH2FRACTION(2)12
DAY4FRACTION(3)13
HOUR6FRACTION(4)14
MINUTE8FRACTION(5)15
SECOND10

例如:如果 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 值。但是,如果用户定义的辅助访问方法提供了用户定义的数据类型,那么这些列具有用户定义的数据类型的值。

标签: GBase, syscolumns, 系统表, coltype

添加新评论