48.52. pg_type

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

表 48-52. pg_type 字段

名字类型引用描述
oidoid 行标识符(隐藏属性;必须明确选择)
typnamename 数据类型名
typnamespaceoidpg_namespace.oid 包含这个类型的名字空间的OID
typowneroidpg_authid.oid该类型的所有者
typlenint2  对于定长类型是该类型内部表现形式的字节数目。对于变长类型是负数。 -1 表示一种"变长"类型(有长度字属性的数据), -2 表示这是一个 NULL 结尾的 C 字符串。
typbyvalbool  判断内部过程传递这个类型的数值时是通过传值还是传引用。 如果该类型不是 1, 2, 4, 8 字节长将只能按引用传递,因此 typbyval 最好是假。 即使可以传值,typbyval 也可以为假。
typtypechar  对于基础类型是b,对于复合类型是c (比如,一个表的行类型)。对于域类型是d,对于枚举类型是e, 对于伪类型是p,对于范围类型是r。 又见typrelidtypbasetype
typcategorychar  typcategory是数据类型的任意分类, 该数据类型被触发器用来决定哪种隐式转换应该是"首选"。 参阅表 48-53
typispreferredbool  如果类型在它的typcategory 里是首选转换目标则为真。
typisdefinedbool  如果定义了类型则为真,如果是一种尚未定义的类型的占位符则为假。如果为假, 那么除了该类型名称,名字空间,和 OID 之外没有可靠的信息。
typdelimchar  当分析数组输入时,分隔两个此类型数值的字符。请注意该分隔符是与数组元素数据类型相关联的, 而不是和数组数据类型关联。
typrelidoidpg_class.oid 如果是复合类型(见typtype)那么这个字段指向pg_class 中定义该表的行。对于自由存在的复合类型,pg_class记录并不表示一个表, 但是总需要它来查找该类型连接的pg_attribute记录。对于非复合类型为零。
typelemoidpg_type.oid 如果不为 0 ,那么它标识pg_type里面的另外一行。 当前类型可以像一个数组产生类型为typelem的值一样当做下标。 一个"真正的"数组类型是变长的(typlen = -1), 但是一些定长的(typlen > 0)类型也拥有非零的typelem (比如namepoint)。如果一个定长类型拥有一个typelem, 那么他的内部形式必须是typelem数据类型的某个数目的个数值, 不能有其它数据。变长数组类型有一个该数组子过程定义的头(文件)。
typarrayoidpg_type.oid 如果typarray非零,那么它在pg_type 里定义另外一行,该行是将这个类型作为元素的"真正的"数组类型。
typinputregprocpg_proc.oid输入转换函数(文本格式)
typoutputregprocpg_proc.oid输出转换函数(文本格式)
typreceiveregprocpg_proc.oid输入转换函数(二进制格式),如果没有则为 0
typsendregprocpg_proc.oid输出转换函数(二进制格式),如果没有则为 0
typmodinregprocpg_proc.oid类型修饰符输入函数,如果类型不支持修饰符则为0
typmodoutregprocpg_proc.oid类型修饰符输出函数,如果使用标准格式则为0
typanalyzeregprocpg_proc.oid自定义的ANALYZE函数,如果使用标准函数,则为 0
typalignchar 

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

可能的值有:

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

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

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

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

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

typstoragechar 

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

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

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

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

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

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

typnotnullbool 

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

typbasetypeoidpg_type.oid

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

typtypmodint4 

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

typndimsint4 

如果是一个域数组,那么typndims是数组维数的数值(也就是说, typbasetype是一个数组类型)。非域非数组类型为零。

typcollationoidpg_collation.oid

指定类型的排序规则。如果类型不支持排序,则为0。一个支持排序的基础类型将有 DEFAULT_COLLATION_OID。一个可排序类型的域可以有一些其他排序OID, 如果为该域指定了一个的话。

typdefaultbinpg_node_tree 

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

typdefaulttext 

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

typaclaclitem[]  访问权限;参阅GRANTREVOKE获取细节。

表 48-53列出了系统定义的typcategory的值。 任何未来添加到这个列表的也是大写的ASCII字母。所有其他ASCII字符为用户定义的范畴保留。

表 48-53. typcategory 代码

代码种类
A数组类型
B布尔类型
C复合类型
D日期/时间类型
E枚举类型
G几何类型
I网络地址类型
N数值类型
P伪类型
R范围类型
S字符串类型
T时间间隔类型
U用户定义类型
V位串类型
X未知 类型