跳转到内容

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

参考资料

[编辑 | 编辑源代码]
华夏公益教科书