第 3 章 数据类型
目录
摘要
描述 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.1. 数字类型
数值类型包括二字节和四字节整数,四字节和八字节浮点数,以及固定精度的小数。
表 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
类型并非在所有平台上都可用,因为它依赖编译器对此的支持。
3.1.1. serial 类型
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 显式删除。