47.51. pg_type

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

Table 47-51. pg_type 字段

名字 类型 引用 描述
oid oid 行标识符(隐藏属性;必须明确选择)
typname name 数据类型名
typnamespace oid pg_namespace.oid 包含这个类型的名字空间的OID
typowner oid pg_authid.oid 该类型的所有者
typlen int2 对于定长类型是该类型内部表现形式的字节数目。对于变长类型是负数。 -1 表示一种"变长"类型(有长度字属性的数据), -2 表示这是一个 NULL 结尾的 C 字符串。
typbyval bool 判断内部过程传递这个类型的数值时是通过传值还是传引用。 如果该类型不是 1, 2, 4, 8 字节长将只能按引用传递,因此 typbyval 最好是假。 即使可以传值,typbyval 也可以为假。
typtype char 对于基础类型是b,对于复合类型是c (比如,一个表的行类型)。对于域类型是d,对于枚举类型是e, 对于伪类型是p,对于范围类型是r。 又见typrelidtypbasetype
typcategory char typcategory是数据类型的任意分类, 该数据类型被触发器用来决定哪种隐式转换应该是"首选"。 参阅Table 47-52
typispreferred bool 如果类型在它的typcategory 里是首选转换目标则为真。
typisdefined bool 如果定义了类型则为真,如果是一种尚未定义的类型的占位符则为假。如果为假, 那么除了该类型名称,名字空间,和 OID 之外没有可靠的信息。
typdelim char 当分析数组输入时,分隔两个此类型数值的字符。请注意该分隔符是与数组元素数据类型相关联的, 而不是和数组数据类型关联。
typrelid oid pg_class.oid 如果是复合类型(见typtype)那么这个字段指向pg_class 中定义该表的行。对于自由存在的复合类型,pg_class记录并不表示一个表, 但是总需要它来查找该类型连接的pg_attribute记录。对于非复合类型为零。
typelem oid pg_type.oid 如果不为 0 ,那么它标识pg_type里面的另外一行。 当前类型可以像一个数组产生类型为typelem的值一样当做下标。 一个"真正的"数组类型是变长的(typlen = -1), 但是一些定长的(typlen > 0)类型也拥有非零的typelem (比如namepoint)。如果一个定长类型拥有一个typelem, 那么他的内部形式必须是typelem数据类型的某个数目的个数值, 不能有其它数据。变长数组类型有一个该数组子过程定义的头(文件)。
typarray oid pg_type.oid 如果typarray非零,那么它在pg_type 里定义另外一行,该行是将这个类型作为元素的"真正的"数组类型。
typinput regproc pg_proc.oid 输入转换函数(文本格式)
typoutput regproc pg_proc.oid 输出转换函数(文本格式)
typreceive regproc pg_proc.oid 输入转换函数(二进制格式),如果没有则为 0
typsend regproc pg_proc.oid 输出转换函数(二进制格式),如果没有则为 0
typmodin regproc pg_proc.oid 类型修饰符输入函数,如果类型不支持修饰符则为0
typmodout regproc pg_proc.oid 类型修饰符输出函数,如果使用标准格式则为0
typanalyze regproc pg_proc.oid 自定义的ANALYZE函数,如果使用标准函数,则为 0
typalign char 当存储此类型的数值时要求的对齐性质。它应用于磁盘存储以及该值在PostgreSQL 内部的大多数形式。如果数值是连续存放的,比如在磁盘上以完全的裸数据的形式存放时, 那么先在此类型的数据前填充空白,这样它就可以按照要求的界限存储。对齐引用是该序列中第一个数据的开头。

可能的值有:

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

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

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

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

Note: 对于在系统表里使用的类型,在pg_type 里定义的尺寸和对齐必须和编译器在一个表示表的一行的结构里的布局一样。 | | typstorage | char | 告诉一个变长类型(那些有typlen = -1的) 说该类型是否准备好应付非常规值,以及对这种类型的属性的缺省策略是什么。可能的值有

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

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

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

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

请注意m域也可以移到从属表里存储,但只是最后的解决方法 (ex域先移走)。 | | typnotnull | bool | 代表在某类型上的一个 NOTNULL 约束。目前只用于域。 | | typbasetype | oid | pg_type.oid | 如果这是一个域(参阅typtype), 那么标识作为这个类型的基础的类型。如果不是域则为零。 | | typtypmod | int4 | 域使用typtypmod记录要作用到它们的基础类型上的typmod (如果基础类型不使用typmod则为 -1)。如果这种类型不是域,那么为 -1 。 | | typndims | int4 | 如果是一个域数组,那么typndims是数组维数的数值(也就是说, typbasetype是一个数组类型)。非域非数组类型为零。 | | typcollation | oid | pg_collation.oid | 指定类型的排序规则。如果类型不支持排序,则为0。一个支持排序的基础类型将有 DEFAULT_COLLATION_OID。一个可排序类型的域可以有一些其他排序OID, 如果为该域指定了一个的话。 | | typdefaultbin | pg_node_tree | 如果为非 NULL ,那么它是该类型缺省表达式的nodeToString()表现形式。 目前这个字段只用于域。 | | typdefault | text | 如果某类型没有相关缺省值,那么typdefault是 NULL 。如果typdefaultbin 不是 NULL ,那么typdefault必须包含一个typdefaultbin 代表的缺省表达式的人类可读的版本。如果typdefaultbin为 NULL 但typdefault 不是,那么typdefault是该类型缺省值的外部表现形式, 可以把它交给该类型的输入转换器生成一个常量。 | | typacl | aclitem[] | 访问权限;参阅GRANTREVOKE获取细节。 |

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

Table 47-52. typcategory 代码

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