43.29. pg_type

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

Table 43-29. 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
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 是该类型缺省值的外部表现形式, 我们可以把它交给该类型的输入转换器生成一个常量。