这个系统表存储有关数据类型的信息.标量类型
(
"基本类型"
)是用
CREATE TYPE
创建的.
同时还为数据库中每个表创建一个复合类型,以表示该表的行结构.
Table 3-21. pg_type 字段
名字 |
类型 |
引用 |
描述 |
typname |
name
|
|
数据类型名字 |
typowner |
int4
|
pg_shadow.usesysid |
该类型的所有人(创建人) |
typlen |
int2
|
|
该类型存储形式的长度,如果是变长为 -1 |
typprtlen |
int2
|
|
未用 |
typbyval |
bool
|
|
typbyval
判断内部过程传递这个类型的数值时
是通过传值还是传引用.
只有
char
,
short
,和
int
或相当的项目可以传值,所以如果该类型不是 1,2,4字节长,
PostgreSQL
不会有传值的选择,因此
typbyval
最好是假.
变长类似总是传引用.请注意即使长度可以传值,
typbyval
也可以为假;
比如,现在
float4
就是如此.
|
typtype |
char
|
|
typtype
对于基础类型
是
b
,对于复合类型是
c
(也就是说,一个表的行类型).
如果
typtype
是
c
,那么
typrelid
是该类型在
pg_class
里的元组的 OID.
|
typisdefined |
bool
|
|
如果定义了类型则为真,如果是一种尚未定义的类型的占位符则为假.
如果 typisdefined 为假,那么除了该类型名称和 OID 之外没有
可靠的信息.
|
typdelim |
char
|
|
当分析数组输入时,分隔两个此类型数值的字符
请注意该分隔符是与数组元素数据类型相关联的,
而不是和数组数据类型关联.
|
typrelid |
oid
|
pg_class.oid |
如果是复合类型(见
typtype
)
那么这个字段指向
pg_class
中定义该表的元组.
表在理论上应该用做复合数据类型,不过现在不是完全都能工作.
|
typelem |
oid
|
pg_type.oid |
如果
typelem
不为 0,
那么它标识
pg_type
里面的另外一行.
当前类型可以当做一个产生类型为
typelem
的数组来描述.
一个
"真正的"
数组类型是变长的
(
typlen
= -1),
但是一些定长的(
typlen
> 0)类型
也拥有非零的
typelem
,比如
name
和
oidvector
.
如果一个定长类型拥有一个
typelem
,
那么他的内部形式必须是
typelem
数据类型的
N 个数值,不能有其它数据.变长数组类型有一个该数组子过程定义的头(文件).
|
typinput |
regproc
|
|
输入函数 |
typoutput |
regproc
|
|
输出函数 |
typreceive |
regproc
|
|
未用 |
typsend |
regproc
|
|
未用 |
typalign |
char
|
|
typalign
是当存储此类型的数值是要求的对齐性质.它应用于磁盘存储以及
该值在
PostgreSQL
内部的大多数形式.
如果数值是连续存放的,比如在磁盘上以完全的裸数据的形式存放时,
那么先在此类型的数据前填充空白,这样它就可以按照要求的界限存储.
对齐引用是该序列中第一个数据的开头.
可能的值有:
-
'c' = CHAR 对齐,也就是不需要对齐.
-
's' = SHORT 对齐 (在大多数机器上是 2字节)
-
'i' = INT 对齐 (在大多数机器上是 4 字节)
-
'd' = DOUBLE 对齐 (在大多数机器上是 8 字节,但不一定是全部)
Note:
对于在系统表里使用的类型,在
pg_type
里定义的尺寸和对齐必须和编译器在一个表示表的一行的结构里
的布局一样.
|
typstorage |
char
|
|
typstorage
告诉一个变长类型(那些有
typlen
= -1的)
说该类型是否准备 toast,以及对这种属性的类型
的缺省策略是什么.
可能的值有
请注意 'm' 域也可以移到从属表里存储,但只是最后的解决方法
('e' 和 'x' 域先移走).
|
typdefault |
text
|
|
对那些没有缺省值的类型,
typdefault
是
NULL.如果它不是 NULL,那么它包含该类型缺省值的外部字串表现形式.
|
|