43.29. pg_type

系統表pg_type存儲有關數據類型的信息。基本類型 (標量類型)是用 CREATE TYPE 創建的。 同時還為數據庫中每個表自動創建一個復合類型,以表示該表的行結構。 我們還可以用CREATE TYPE AS創建復合類型, 用 CREATE DOMAIN 創建衍生的類型。

Table 43-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 數據類型的 某個數目地個數值,不能有其它數據。變長數組類型有一個該數組子過程定義的頭(文件)。
typinputregprocpg_proc.oid輸入轉換函數(文本格式)
typoutputregprocpg_proc.oid輸出轉換函數(文本格式)
typreceiveregprocpg_proc.oid輸入轉換函數(二進制格式),如果沒有則為 0
typsendregprocpg_proc.oid輸出轉換函數(二進制格式),如果沒有則為 0
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 域也可以移到從屬表裡存儲,但只是最後的解決方法 (ex 域先移走)。

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 是該類型缺省值的外部表現形式, 我們可以把它交給該類型的輸入轉換器生成一個常量。