sys_type(数据类型)¶
这个系统表存储数据类型的信息。标量类型("基本类型")是用 CREATE TYPE 创建的。同时还为数据库中每个表创建一个复合类型,以表示该表的行结构。我们还可以用 CREATE DOMAIN 创建衍生的类型。
| 列名 | 类型 | 描述 |
|---|---|---|
| OID | OID | 数据类型OID |
| TYPNAME | NAME | 数据类型名字 |
| TYPNAMESPACE | OID | 包含这个类型的名字空间的 OID |
| TYPRELID | OID | 如果是复合类型(见typtype)那么这个字段指向 sys_class 中定义该表的元组。表在理论上应该用做复合数据类型,不过现在不是完全都能工作。非复合类型为零。 |
| TYPELEM | OID | 如果typelem 不为 0,那么它标识 sys_type 里面的另外一行。类型可以当做一个产生类型为 typelem 的数组来描述。一个"真正的" 数组类型是变长的(typlen = -1),但是一些定长的(typlen> 0)类型也拥有非零的typelem,比如 name 和 oidvector。如果一个定长类型拥有一个typelem,那么他的内部形式必须是 typelem 数据类型的N 个数值,不能有其它数据。变长数组类型有一个该数组子过程定义的头(文件)。 |
| TYPBASETYPE | OID | 如果这是一个衍生类型(参阅typtype),那么 typbasetype标识作为这个类型的基础的类型。如果不是衍生类型则为零 |
| TYPINPUT | REGPROC | 输入函数 |
| TYPOUTPUT | REGPROC | 输出函数 |
| TYPOWNER | INT | 该类型的所有者(创建者) |
| TYPTYPMOD | INT | typtypmod记录在表创建的时候提供的与类型相关的数据(比如,varchar 字段的最大长度)。它将作为第三个参数传递给类型相关的输入输出函数。对于那些不需要 typmod 的类型而言,其值通常是 -1。在创建一个域类型的字段的时候,这个值拷贝到 sys_attribute.atttypmod |
| TYPNDIMS | INT | typndims是一个域的数组维数 -- 如果这个域是数组的话。(数组元素类型是 typbasetype)在创建一个域类型的字段时,这个值拷贝到sys_attribute.attndims |
| TYPLEN | SMALLINT | 该类型存储形式的长度,如果是变长为-1 |
| TYPBYVAL | BOOLEAN | typbyval判断内部过程传递这个类型的数值时是通过传值还是传引用。只有 char,short,和 int 或相当的项目可以传值,所以如果该类型不是 1,2,4字节长,不会有传值的选择,因此 typbyval 最好是假。变长类型总是传引用。请注意即使长度可以传值,typbyval 也可以为假;比如,现在 float4就是如此。 |
| TYPTYPE | "CHAR" | typtype对于基础类型是 b,对于复合类型是 c(也就是说,一个表的行类型)。或者在衍生类型时是 d (也就是说,一个域)。对假类型是p。又见 typrelid 和 typbasetype |
| TYPISDEFINED | BOOLEAN | 如果定义了类型则为真,如果是一种尚未定义的类型的占位符则为假。如果 typisdefined 为假,那么除了该类型名称和OID 之外没有可靠的信息 |
| TYPDELIM | "CHAR" | 当分析数组输入时,分隔两个此类型数值的字符。请注意该分隔符是与数组元素数据类型相关联的,而不是和数组数据类型关联 |
| TYPALIGN | "CHAR" | typalign是当存储此类型的数值时要求的对齐性质。它应用于磁盘存储以及该值在内部的大多数形式。如果数值是连续存放的,比如在磁盘上以完全的裸数据的形式存放时,那么先在此类型的数据前填充空白,这样它就可以按照要求的界限存储。对齐引用是该序列中第一个数据的开头。可能的值有:'c' = CHAR 对齐,也就是不需要对齐。's' = SHORT 对齐(在大多数机器上是 2字节)'i' = INT 对齐(在大多数机器上是 4 字节)'d' = DOUBLE 对齐(在大多数机器上是 8 字节,但不一定是全部)(Note: 对于在系统表里使用的类型,在 sys_type 里定义的尺寸和对齐必须和编译器在一个表示表的一行的结构里的布局一样) |
| TYPSTORAGE | "CHAR" | typstorage告诉一个变长类型(那些有 typlen = -1的)说该类型是否准备 toast,以及对这种属性的类型的缺省策略是什么。可能的值有 'p': 数值必须总是以平面方式存储'e': 数值可以存储在一个"从属" 关系中(如果该关系有这么一个,参阅 sys_class.reltoastrelid)。'm': 数值可以以内联的压缩方式存储'x': 数值可以以内联的压缩方式或者在"从属"表里存储。请注意 'm' 域也可以移到从属表里存储,但只是最后的解决方法('e' 和 'x' 域先移走) |
| TYPNOTNULL | BOOLEAN | typnotnull代表在某类型上的一个 NOT NULL 约束。目前只用于域 |
| TYPECODE | OID | 自定义类型的种类 |
| PROPERTIES | BIGINT | 类型属性 |
| ATTRIBUTES | INT | 自定义类型包含属性的个数 |
| METHODS | INT | 自定义类型包含方法的个数 |
| TYPMODIN | REGPROC | 类型修饰符输入函数 |
| TYPMODOUT | REGPROC | 类型修饰符输出函数 |
| LOCAL_ATTRS | INT | 自定义类型本地属性的个数(暂未使用) |
| LOCAL_METHODS | INT | 自定义类型本地方法的个数(暂未使用) |
| ROOTOID | OID | 自定义类型继承层次的根类型(暂未使用) |
| SUPEROID | OID | 自定义类型的父类型(暂未使用) |
| TYPEID | INT | 自定义类型在继承树中的编号(暂未使用) |
| TYPDEFAULTBIN | TEXT | 如果typdefaultbin 为非 NULL,那么它是该类型缺省表达式的 nodeToString 表现形式(目前这个字段只用于域) |
| TYPDEFAULT | TEXT | 如果某类型没有相关缺省值,那么typdefault是 NULL。如果 typdefaultbin 不是 NULL,那么 typdefault 必须包含一个 typdefaultbin 代表的缺省表达式的人类可读的版本。如果 typdefaultbin为NULL但 typdefault 不是,那么 typdefault 是该类型缺省值的外部表现形式,我们可以把它交给该类型的输入转换器生成一个常量 |