41.30. pg_type

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

Table 41-30. 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
typanalyzeregprocpg_proc.oid客戶化的 ANALYZE 函數,如果使用標準函數,則為 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 是該類型預設值的外部資料表現形式, 我們可以把它交給該類型的輸入轉換器生成一個常量。