3.29. pg_type

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

Table 3-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 数据类型的 N 个数值,不能有其它数据.变长数组类型有一个该数组子过程定义的头(文件).
typinputregprocpg_proc.oid输入转换函数
typoutputregprocpg_proc.oid输出转换函数
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' 域也可以移到从属表里存储,但只是最后的解决方法 ('e' 和 'x' 域先移走).

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