41.30. pg_type

系统表pg_type存储有关数据类型的信息。 基本类型(标量类型)是用 CREATE TYPE 创建的, 域是使用 CREATE DOMAIN 创建的。 同时还为数据库中每个表自动创建一个复合类型,以表示该表的行结构。 我们还可以用CREATE TYPE AS创建复合类型。

Table 41-30. pg_type 字段

名字类型引用描述
typnamename 数据类型名字
typnamespaceoidpg_namespace.oid 包含这个类型的名字空间的 OID
typownerint4pg_shadow.usesysid该类型的所有人
typlenint2  对于定长类型,typlen是该类型内部表现形式的字节数目。 对于变长类型,typlen 是负数。 -1 表示一种"变长"类型(有长度字属性的数据), -2 表示这是一个 NULL 结尾的 C 字串。
typbyvalbool  typbyval 判断内部过程传递这个类型的数值时是通过传值还是传引用。 只有 charshort,和 int 或相当的项目可以传值,所以如果该类型不是 1,2,4字节长, PostgreSQL 不会有传值的选择,因此 typbyval 最好是假。 变长类似总是传引用。请注意即使长度可以传值, typbyval 也可以为假; 比如,现在 float4就是如此。
typtypechar  typtype对于基础类型 是 b,对于复合类型是 c (比如,一个表的行类型)。 衍生类型时是 d (也就是说,一个域), 或者是p 表示伪类型。 又见 typrelidtypbasetype
typisdefinedbool  如果定义了类型则为真,如果是一种尚未定义的类型的占位符则为假。 如果typisdefined为假,那么除了该类型名称,名字空间,和 OID 之外没有可靠的信息。
typdelimchar 当分析数组输入时,分隔两个此类型数值的字符请注意该分隔符是与数组元素数据类型相关联的, 而不是和数组数据类型关联。
typrelidoidpg_class.oid 如果是复合类型(见 typtype) 那么这个字段指向 pg_class 中定义该表的元组。 (对于自由存在的复合类型,pg_class 记录并不表示一个表,但是我们总需要它来查找该类型联接的 pg_attribute 记录。) 非复合类型为零。
typelemoidpg_type.oid 如果 typelem 不为 0, 那么它标识 pg_type 里面的另外一行。 当前类型可以当做一个产生类型为 typelem 的数组来描述。 一个"真正的" 数组类型是变长的 (typlen = -1), 但是一些定长的(typlen> 0)类型也拥有非零的 typelem,比如 nameoidvector。 如果一个定长类型拥有一个typelem, 那么他的内部形式必须是 typelem 数据类型的某个数目的个数值,不能有其它数据。变长数组类型有一个该数组子过程定义的头(文件)。
typinputregprocpg_proc.oid输入转换函数(文本格式)
typoutputregprocpg_proc.oid输出转换函数(文本格式)
typreceiveregprocpg_proc.oid输入转换函数(二进制格式),如果没有则为 0
typsendregprocpg_proc.oid输出转换函数(二进制格式),如果没有则为 0
typanalyzeregprocpg_proc.oid客户化的 ANALYZE 函数,如果使用标准函数,则为 0
typalignchar 

typalign 是当存储此类型的数值是要求的对齐性质。它应用于磁盘存储以及该值在 PostgreSQL 内部的大多数形式。 如果数值是连续存放的,比如在磁盘上以完全的裸数据的形式存放时, 那么先在此类型的数据前填充空白,这样它就可以按照要求的界限存储。 对齐引用是该序列中第一个数据的开头。

可能的值有:

  • c = char 对齐,也就是不需要对齐。

  • s = short 对齐 (在大多数机器上是 2字节)

  • i = int 对齐 (在大多数机器上是 4 字节)

  • d = double 对齐 (在大多数机器上是 8 字节,但不一定是全部)

Note: 对于在系统表里使用的类型,在 pg_type 里定义的尺寸和对齐必须和编译器在一个表示表的一行的结构里的布局一样。

typstoragechar 

typstorage 告诉一个变长类型(那些有 typlen = -1的) 说该类型是否准备 toast,以及对这种属性的类型的缺省策略是什么。 可能的值有

  • p: 数值总是以简单方式存储

  • e: 数值可以存储在一个"从属" 关系中(如果该关系有这么一个,参阅 pg_class.reltoastrelid).

  • m: 数值可以以内联的压缩方式存储

  • x: 数值可以以内联的压缩方式或者在"从属"表里存储。

请注意 m 域也可以移到从属表里存储,但只是最后的解决方法 (ex 域先移走)。

typnotnullbool 

typnotnull 代表在某类型上的一个 NOT NULL 约束。目前只用于域。

typbasetypeoidpg_type.oid

如果这是一个衍生类型(参阅 typtype), 那么 typbasetype 标识作为这个类型 的基础的类型。如果不是衍生类型则为零。

typtypmodint4 

域使用 typtypmod 记录要施用到它们的基础类型上的typmod (如果基础类型不使用typmod,那么为 -1)。如果这种类型不是域,那么为 -1。

typndimsint4 

如果一个域是数组,那么 typndims 是数组维数的数值 (也就是说,typbasetype是一个数组类型;域的typelem将匹配基本类型的 typelem)。非域非数组域为零。

typdefaultbintext 

如果 typdefaultbin 为非 NULL,那么它是 该类型缺省表达式的nodeToString表现形式。目前这个字段只用于域。

typdefaulttext 

如果某类型没有相关缺省值,那么typdefault是 NULL。如果 typdefaultbin 不是 NULL, 那么 typdefault 必须包含一个 typdefaultbin 代表的缺省表达式的人类可读的版本。 如果 typdefaultbin 为 NULL 但 typdefault 不是,那么 typdefault 是该类型缺省值的外部表现形式, 我们可以把它交给该类型的输入转换器生成一个常量。