ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 47.51\. `pg_type` `pg_type`存储有关数据类型的信息。基本类型和枚举类型(标量类型)是用 [CREATE TYPE](#calibre_link-100)创建的,域是使用[CREATE DOMAIN](#calibre_link-567)创建的。 同时还为数据库中每个表自动创建一个复合类型,以表示该表的行结构。还可以用 `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`。 又见`typrelid`和`typbasetype`。 | | `typcategory` | `char` | `typcategory`是数据类型的任意分类, 该数据类型被触发器用来决定哪种隐式转换应该是"首选"。 参阅[Table 47-52](#calibre_link-1465)。 | | `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` (比如`name`和`point`)。如果一个定长类型拥有一个`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`域也可以移到从属表里存储,但只是最后的解决方法 (`e`和`x`域先移走)。 | | `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[]` | 访问权限;参阅[GRANT](#calibre_link-19)和[REVOKE](#calibre_link-20)获取细节。 | [Table 47-52](#calibre_link-1465)列出了系统定义的`typcategory`的值。 任何未来添加到这个列表的也是大写的ASCII字母。所有其他ASCII字符为用户定义的范畴保留。 **Table 47-52\. `typcategory` 代码** | 代码 | 种类 | | --- | --- | | `A` | 数组类型 | | `B` | 布尔类型 | | `C` | 复合类型 | | `D` | 日期/时间类型 | | `E` | 枚举类型 | | `G` | 几何类型 | | `I` | 网络地址类型 | | `N` | 数值类型 | | `P` | 伪类型 | | `R` | 范围类型 | | `S` | 字符串类型 | | `T` | 时间间隔类型 | | `U` | 用户定义类型 | | `V` | 位串类型 | | `X` | `未知` 类型 |