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.89或192.168.0.1/24。INET 接受網路掩碼右側的非零位(在輸入時)。 - CIDR:它儲存一個 IPv4 或 IPv6 網路規範,並可選地儲存一個網路掩碼,例如:
123.45.67.89或192.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 約束的說明。