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 约束的说明。