↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 6.4 已于 2003 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

第 8 章 数据类型

摘要

描述 Postgres 中可用的内建数据类型。

Postgres 有一套丰富的本机数据类型可供用户使用。用户可以用在别处描述的 define type 命令向 Postgres 添加新类型。

在数据类型的语境下,下面几节将讨论 SQL 标准兼容性、移植问题和使用方法。 某些 Postgres 类型直接对应于 SQL92 兼容类型。另一些情况下,由 SQL92 语法定义的数据类型被直接映射为 Postgres 本机类型。 许多内建类型都有显而易见的外部格式。但也有一些类型要么为 Postgres 所独有(例如开放和闭合路径),要么有多种可选格式(例如日期和时间类型)。

表 8.1. Postgres 数据类型

Postgres 类型 SQL92 或 SQL3 类型 描述
bool boolean 逻辑布尔值(真/假)
box   二维平面上的矩形框
char(n) character(n) 定长字符串
cidr   IPv4 网络或主机地址
circle   二维平面上的圆
date date 不含时间的日历日期
float4/8 float(p) 精度为 p 的浮点数
float8 real, double precision 双精度浮点数
inet   IPv4 网络或主机地址
int2 smallint 有符号二字节整数
int4 int, integer 有符号 4 字节整数
int4 decimal(p,s) p <= 9、s = 0 的精确数值
int4 numeric(p,s) p == 9、s = 0 的精确数值
int8   有符号 8 字节整数
line   二维平面上的无限直线
lseg   二维平面上的线段
money decimal(9,2) 美式货币
path   二维平面上的开放和闭合几何路径
point   二维平面上的几何点
polygon   二维平面上的封闭几何路径
serial   用于索引和交叉引用的唯一 id
time time 一天中的时间
timespan interval 通用时间段
timestamp timestamp with time zone 日期/时间
varchar(n) character varying(n) 变长字符串


注意

cidr 和 inet 类型设计为可处理任何 IP 类型,但当前实现只处理 ipv4。这里所有关于 ipv4 的内容在未来的版本中都将适用于 ipv6。

表 8.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 不会花大力气去符合这些特性;不过它们往往只适用于很少使用或冷僻的场景,典型用户不太可能遇到。

大多数对应于基本类型(如整数和浮点数)的输入和输出函数会做一些错误检查。为了提高执行速度,某些运算符和函数(例如加法和乘法)不做运行时错误检查。例如在某些系统上,某些数据类型的数值运算符可能静默下溢或上溢。

注意,有些输入和输出函数是不可逆的。也就是说,输出函数的结果与原始输入相比可能损失精度。

注意

从 Berkeley 收到的最初 Postgres v4.2 代码会把所有双精度浮点结果四舍五入到六位输出。从 v6.1 开始,浮点数允许保留该类型的大部分固有精度(双精度通常 15 位,4 字节浮点通常 6 位)。底层为浮点字段的其他类型(如几何类型)具有类似的精度。

8.1. 数字类型

数值类型包括二字节和四字节整数以及四字节和八字节浮点数。

表 8.3. Postgres 数值类型

数值类型 存储尺寸 描述 范围
float4 4字节 可变精度 6 位十进制小数
float8 8字节 可变精度 15 位十进制小数
int2 2字节 定点数 -32768 到 +32767
int4 4字节 定点数的常用选择 -2147483648 到 +2147483647
int8 8字节 极大范围定点数 +/- > 18 位十进制小数
serial 4字节 标识符或交叉引用 0 到 +2147483647


数值类型有一整套相应的算术运算符和 函数。更多信息请参阅 数值操作符 和 数学函数。

serial 类型是由 Postgres 用其他现有构件构造的一种特殊类型。它通常用于为表条目创建唯一标识符。 在当前的实现中,指定

CREATE TABLE tablename (colname SERIAL);

等效于指定:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename
    (colname INT4 DEFAULT nextval('tablename_colname_seq');
CREATE UNIQUE INDEX tablename_colname_key on tablename (colname);

小心

为 serial 类型创建的隐式序列在表被删除时不会被自动删除。因此,按顺序执行下面的命令很可能会失败:

CREATE TABLE tablename (colname SERIAL);
DROP TABLE tablename;
CREATE TABLE tablename (colname SERIAL);
     

该序列会一直留在数据库中,直到用 DROP SEQUENCE 显式删除。

精确数值 decimal 和 numeric 拥有完整实现的语法,但目前(Postgres v6.4)只支持较小的精度和/或取值范围。 int8 类型并非在所有平台上都可用,因为它依赖编译器对此的支持。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。