跳轉到內容

PostgreSQL/資料型別

來自華夏公益教科書,自由的教學讀物


標準資料型別

[編輯 | 編輯原始碼]

PostgreSQL 支援由SQL 標準定義的基本資料型別集,並在華夏公益教科書 SQL中描述(但:CLOB 被稱為 TEXT,BLOB 被稱為 BYTEA)[1].

字元型別
字元 (CHAR)
可變字元 (VARCHAR)
大型字元物件 (TEXT/CLOB)
二進位制型別
二進位制 (BINARY)
可變二進位制 (VARBINARY)
大型二進位制物件 (BYTEA/BLOB)
數值型別
精確數值型別 (NUMERIC, DECIMAL, SMALLINT, INTEGER, BIGINT)
近似數值型別 (FLOAT, REAL, DOUBLE PRECISION)
日期時間型別
(DATE, TIME, TIMESTAMP. 帶或不帶時區.)
間隔型別
(INTERVAL)
布林值
XML
JSON
JSON 和 JSONB 儲存的資料符合RFC 7159。這兩種資料型別之間的區別在於,JSON 在內部使用純文字表示,而 JSONB 使用分解的二進位制格式。

除了這些基本型別之外,還有一些預定義型別以及定義自定義複合資料型別的機制。

對標準的擴充套件

[編輯 | 編輯原始碼]
SERIAL
SERIAL 生成一系列整數值,通常用作主鍵。但是 SERIAL 不是真正的資料型別。在內部,它使用 INTEGER 型別並透過序列來實現。
ENUM
它定義了一個靜態的有序值集,例如:顏色、星期幾等。
MONETARY
它以固定的小數精度表示貨幣值。
GEOMETRIC
POINT、LINE、LSEG、BOX、PATH、POLYGON 和 CIRCLE 被“開箱即用”地支援(無需安裝擴充套件PostGIS)。
網路地址型別
MACADDR、MACADDR8:它們儲存 MAC 地址。
INET:它儲存一個 IPv4 或 IPv6 主機地址,並可選地儲存一個網路掩碼,例如:123.45.67.89192.168.0.1/24。INET 接受網路掩碼右側的非零位(在輸入時)。
CIDR:它儲存一個 IPv4 或 IPv6 網路規範,並可選地儲存一個網路掩碼,例如:123.45.67.89192.168.0.0/24。CIDR 不接受網路掩碼右側的非零位(在輸入時)。
位型別
BIT(n) 和 BIT VARYING(n) 儲存“0”和“1”,就像 CHAR 儲存字元一樣。
UUID
它根據RFC 4122儲存 128 位序列。它主要用於儲存唯一值。
HSTORE
鍵值對(透過擴充套件 HSTORE)。

特殊型別

[編輯 | 編輯原始碼]

根據 SQL:2011,PostgreSQL 支援陣列。表的列可以定義為上述資料型別的可變長度多維陣列。

CREATE TABLE tbl_1 (
  id         SERIAL,
  -- A one dimensional array of integers. It's possible to use multidimensional arrays, eg: INTEGER[][]
  column_1   INTEGER[]
);

-- construct arrays with curly braces or with the ARRAY[] syntax
INSERT INTO tbl_1 VALUES (1, '{1, 2, 3, 4}');
INSERT INTO tbl_1 VALUES (2, ARRAY[5, 6, 7]);

-- specify certain elements of an array with the [] syntax
SELECT * FROM tbl_1 WHERE column_1[2] = 2;
 id | column_1 
----+-----------
  1 | {1,2,3,4}

複合型別

[編輯 | 編輯原始碼]

您可以透過排列一組有序的資料型別來建立新型別 - 類似於其他程式語言中的結構體記錄。這種新型別可以在所有使用預定義資料型別的地方使用(列、函式引數等)。

-- create a composite type
CREATE TYPE person AS (
  first_name    CHAR(15),
  last_name     CHAR(15)
);

-- Use the composite type to define columns with the desired structure
CREATE TABLE tbl_2 (
  id         SERIAL,
  -- the composite type
  pers       person,
  -- an array of up to 5 hobbies
  hobbies    CHAR(10) [5]
);

-- construct values of the composite type with () syntax
INSERT INTO tbl_2 VALUES (1, '(John D., Walker)', '{Sports, Chess}');

SELECT * FROM tbl_2;
 id |                 pers                  |           hobbies          
----+---------------------------------------+-----------------------------
  1 | ("John D.        "," Walker        ") | {"Sports    ","Chess     "}

範圍型別

[編輯 | 編輯原始碼]

範圍型別是表示值範圍的資料型別,例如:整型範圍或日期或時間戳範圍。這類似於 BETWEEN 約束。但它還提供了確保不同行值不重疊的額外可能性;請參閱帶有 GIST 索引的 EXCLUSION 約束的說明。

參考資料

[編輯 | 編輯原始碼]
華夏公益教科書