系统表pg_type存储有关数据类型的信息。基本类型 (标量类型)是用 CREATE TYPE 创建的。 同时还为数据库中每个表自动创建一个复合类型,以表示该表的行结构。 我们还可以用CREATE TYPE AS创建复合类型, 用 CREATE DOMAIN 创建衍生的类型。
Table 43-29. pg_type 字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
typname | name | 数据类型名字 | |
typnamespace | oid | pg_namespace.oid | 包含这个类型的名字空间的 OID |
typowner | int4 | pg_shadow.usesysid | 该类型的所有人 |
typlen | int2 | 对于定长类型,typlen是该类型内部 表现形式的字节数目。对于变长类型,typlen 是负数。 -1 表示一种"变长"类型(有长度字属性的数据), -2 表示这是一个 NULL 结尾的 C 字串。 | |
typbyval | bool | typbyval 判断内部过程传递这个类型的数值时 是通过传值还是传引用。 只有 char,short,和 int 或相当的项目可以传值,所以如果该类型不是 1,2,4字节长, PostgreSQL 不会有传值的选择,因此 typbyval 最好是假。 变长类似总是传引用。请注意即使长度可以传值, typbyval 也可以为假; 比如,现在 float4就是如此。 | |
typtype | char | typtype对于基础类型 是 b,对于复合类型是 c (也就是说,一个表的行类型)。 衍生类型时是 d (也就是说,一个域), 或者是p 表示伪类型。 又见 typrelid 和 typbasetype。 | |
typisdefined | bool | 如果定义了类型则为真,如果是一种尚未定义的类型的占位符则为假。 如果typisdefined为假,那么除了该类型名称,名字空间,和 OID 之外没有 可靠的信息。 | |
typdelim | char | 当分析数组输入时,分隔两个此类型数值的字符 请注意该分隔符是与数组元素数据类型相关联的, 而不是和数组数据类型关联。 | |
typrelid | oid | pg_class.oid | 如果是复合类型(见 typtype) 那么这个字段指向 pg_class 中定义该表的元组。 (对于自由存在的复合类型,pg_class 记录 并不表示一个表,但是我们总需要它来查找该类型联接的 pg_attribute 记录。) 非复合类型为零。 |
typelem | oid | pg_type.oid | 如果 typelem 不为 0, 那么它标识 pg_type 里面的另外一行。 当前类型可以当做一个产生类型为 typelem 的数组来描述。 一个"真正的" 数组类型是变长的 (typlen = -1), 但是一些定长的(typlen> 0)类型 也拥有非零的 typelem,比如 name 和 oidvector。 如果一个定长类型拥有一个typelem, 那么他的内部形式必须是 typelem 数据类型的 某个数目的个数值,不能有其它数据。变长数组类型有一个该数组子过程定义的头(文件)。 |
typinput | regproc | pg_proc.oid | 输入转换函数(文本格式) |
typoutput | regproc | pg_proc.oid | 输出转换函数(文本格式) |
typreceive | regproc | pg_proc.oid | 输入转换函数(二进制格式),如果没有则为 0 |
typsend | regproc | pg_proc.oid | 输出转换函数(二进制格式),如果没有则为 0 |
typalign | char | typalign 是当存储此类型的数值是要求的对齐性质。它应用于磁盘存储以及 该值在 PostgreSQL 内部的大多数形式。 如果数值是连续存放的,比如在磁盘上以完全的裸数据的形式存放时, 那么先在此类型的数据前填充空白,这样它就可以按照要求的界限存储。 对齐引用是该序列中第一个数据的开头。 可能的值有:
| |
typstorage | char | typstorage 告诉一个变长类型(那些有 typlen = -1的) 说该类型是否准备 toast,以及对这种属性的类型 的缺省策略是什么。 可能的值有
请注意 m 域也可以移到从属表里存储,但只是最后的解决方法 (e 和 x 域先移走)。 | |
typnotnull | bool | typnotnull 代表在某类型上的一个 NOT NULL 约束。目前只用于域。 | |
typbasetype | oid | pg_type.oid | 如果这是一个衍生类型(参阅 typtype), 那么 typbasetype 标识作为这个类型 的基础的类型。如果不是衍生类型则为零。 |
typtypmod | int4 | 域使用 typtypmod 记录要施用到它们的基础 类型上的typmod(如果基础类型不使用typmod,那么为 -1)。如果这种类型 不是域,那么为 -1。 | |
typndims | int4 | 如果一个域是数组,那么 typndims 是数组维数的数值 (也就是说,typbasetype是一个数组类型;域的typelem将匹配基本类型的 typelem)。非域非数组域为零。 | |
typdefaultbin | text | 如果 typdefaultbin 为非 NULL,那么它是 该类型缺省表达式的nodeToString表现形式。目前这个字段只用于域。 | |
typdefault | text | 如果某类型没有相关缺省值,那么typdefault是 NULL。如果 typdefaultbin 不是 NULL, 那么 typdefault 必须包含一个 typdefaultbin 代表的缺省表达式的人类可读的版本。 如果 typdefaultbin 为 NULL 但 typdefault 不是,那么 typdefault 是该类型缺省值的外部表现形式, 我们可以把它交给该类型的输入转换器生成一个常量。 |