pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
目录
摘要
描述 Postgres 中可用的内建数据类型。
Postgres 有一套丰富的本机数据类型可供用户使用。用户可以用 CREATE TYPE 命令向 Postgres 添加新类型。
在数据类型的语境下,下面几节将讨论 SQL 标准兼容性、移植问题和使用方法。 某些 Postgres 类型直接对应于 SQL92 兼容类型。另一些情况下,由 SQL92 语法定义的数据类型被直接映射为 Postgres 本机类型。 许多内建类型都有显而易见的外部格式。但也有一些类型要么为 Postgres 所独有(例如开放和闭合路径),要么有多种可选格式(例如日期和时间类型)。
表 3.1. Postgres 数据类型
| Postgres 类型 | SQL92 或 SQL3 类型 | 描述 |
|---|---|---|
| bool | boolean | 逻辑布尔值(真/假) |
| box | 二维平面上的矩形框 | |
| char(n) | character(n) | 定长字符串 |
| cidr | IPv4 网络或主机地址 | |
| circle | 二维平面上的圆 | |
| date | date | 不含时间的日历日期 |
| decimal | decimal(p,s) | p <= 9、s = 0 的精确数值 |
| float4 | float(p), p < 7 |
精度为 p 的浮点数 |
| float8 | float(p), 7 <= p < 16 |
精度为 p 的浮点数 |
| inet | IPv4 网络或主机地址 | |
| int2 | smallint | 有符号2字节整数 |
| int4 | int, integer | 有符号 4 字节整数 |
| int8 | 有符号 8 字节整数 | |
| interval | interval | 通用时间段 |
| line | 二维平面上的无限直线 | |
| lseg | 二维平面上的线段 | |
| money | decimal(9,2) | 美式货币 |
| numeric | numeric(p,s) | p == 9、s = 0 的精确数值 |
| path | 二维平面上的开放和闭合几何路径 | |
| point | 二维平面上的几何点 | |
| polygon | 二维平面上的封闭几何路径 | |
| serial | 用于索引和交叉引用的唯一 id | |
| time | time | 一天中的时间 |
| timetz | time with time zone | 一天中的时间,包括时区 |
| timestamp | timestamp with time zone | 日期/时间 |
| varchar(n) | character varying(n) | 变长字符串 |
cidr 和 inet 类型设计为可处理任何 IP 类型,但当前实现只处理 ipv4。这里所有关于 ipv4 的内容在未来的版本中都将适用于 ipv6。
表 3.2. Postgres 函数常量
| Postgres 函数 | SQL92 常量 | 描述 |
|---|---|---|
| getpgusername() | current_user | 当前会话中的用户名 |
| date('now') | current_date | 当前事务的日期 |
| time('now') | current_time | 当前事务的时间 |
| timestamp('now') | current_timestamp | 当前事务的日期和时间 |
Postgres 的特性处于 ORDBMS 开发的前沿。除了符合 SQL3 之外,还支持 SQL92 的很大一部分。尽管我们力求 SQL92 兼容,但该标准有一些方面考虑欠周,不应延续到后续标准中。Postgres 不会花大力气去符合这些特性;不过它们往往只适用于很少使用或冷僻的场景,典型用户不太可能遇到。
大多数对应于基本类型(如整数和浮点数)的输入和输出函数会做一些错误检查。为了提高执行速度,某些运算符和函数(例如加法和乘法)不做运行时错误检查。例如在某些系统上,某些数据类型的数值运算符可能静默下溢或上溢。
有些输入和输出函数是不可逆的。也就是说,输出函数的结果与原始输入相比可能损失精度。
浮点数允许保留该类型的大部分固有精度(双精度通常 15 位,4 字节浮点通常 6 位)。底层为浮点字段的其他类型(如几何类型)具有类似的精度。
数值类型包括二字节和四字节整数,四字节和八字节浮点数,以及固定精度的小数。
表 3.3. Postgres 数值类型
| 数值类型 | 存储尺寸 | 描述 | 范围 |
|---|---|---|---|
| decimal | 可变 | 用户指定精度 | 约 8000 位 |
| float4 | 4字节 | 可变精度 | 6 位十进制小数 |
| float8 | 8字节 | 可变精度 | 15 位十进制小数 |
| int2 | 2字节 | 定点数 | -32768 到 +32767 |
| int4 | 4字节 | 定点数的常用选择 | -2147483648 到 +2147483647 |
| int8 | 8字节 | 极大范围定点数 | +/- > 18 位十进制小数 |
| numeric | 可变 | 用户指定精度 | 无限制 |
| serial | 4字节 | 标识符或交叉引用 | 0 到 +2147483647 |
数值类型有一整套相应的算术运算符和函数。更多信息请参阅 数值操作符 和 数学函数。
int8 类型并非在所有平台上都可用,因为它依赖编译器对此的支持。
serial 类型是由 Postgres 用其他现有构件构造的一种特殊类型。它通常用于为表条目创建唯一标识符。 在当前的实现中,指定
CREATE TABLEtablename(colnameSERIAL);
等效于指定:
CREATE SEQUENCEtablename_colname_seq; CREATE TABLEtablename(colnameINT4 DEFAULT nextval('tablename_colname_seq'); CREATE UNIQUE INDEXtablename_colname_key ontablename(colname);
为 serial 类型创建的隐式序列在表被删除时不会被自动删除。
支撑 serial 的隐式序列不会在包含 serial 类型的表被删除时自动删除。因此,按顺序执行下面的命令很可能会失败:
CREATE TABLEtablename(colnameSERIAL); DROP TABLEtablename; CREATE TABLEtablename(colnameSERIAL);
该序列会一直留在数据库中,直到用 DROP SEQUENCE 显式删除。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。