Chapter 3. 数据类型

Table of Contents
3.1. 数值类型
3.2. 货币类型
3.3. 字符类型
3.4. 日期/时间类型
3.4.1. 日期/时间输入
3.4.2. 日期/时间输出
3.4.3. 时区
3.4.4. 内部
3.5. 布尔类型
3.6. 几何类型
3.6.1. Point(点)
3.6.2. 线段
3.6.3. Box(方)
3.6.4. Path(路径)
3.6.5. Polygon(多边形)
3.6.6. Circle(圆)
3.7. 网络地址数据类型
3.7.1. inet
3.7.2. cidr
3.7.3. inetcidr 对比
3.7.4. macaddr
3.8. 位串类型

Postgres 有着丰富的数据类型可用. 用户可以使用 CREATE TYPE命令为 Postgres 增加新的数据类型.

Table 3-1 显示了所有用户可以使用的 普通数据类型.在“别名”列里列出的大多数可选名字 都是因历史原因 Postgres 在内部使用的 名字.另外,还有一些内部使用的或者废弃的类型也可以用, 但在这里没有文档. 许多内建的数据类型有明确的外部格式.但是,有一些数据类型或者是 Postgres 特有的,如开放和闭合路径, 或者是有几种可能格式的类型,如日期和时间类型.

Table 3-1. 数据类型

类型名字别名描述
bigintint8有符号 8 字节整数
bit 定长位串
bit varying(n)varbit(n)变长位串
booleanbool逻辑布尔量 (真/假)
box 二维平面中的长方形
character(n)char(n)定长字符串
character varying(n)varchar(n)变长字符串
cidr IP 网络地址
circle 二维平面中的圆
date 日历日期(年,月,日)
double precisionfloat8双精度浮点数字
inet IP 网络或主机地址
integerintint4四字节长有符号整数
interval 通用的时间间隔
line 二维平面中的无限长直线
lseg 二维平面中的线段
macaddr MAC 地址
money 美国风格的货币类型
numeric(p, s)decimal(p, s)可选精度的准确数字
oid 对象标识符
path 二维平面的开放的或封闭的几何路径
point 二维平面中的点
polygon 二维平面中的封闭几何路径
realfloat4单精度浮点数
smallintint2有符号两字节整数
serial 自增四字节整数
text 变长字符串
time [ without time zone ] 一天里的时间
time with time zone 一天里的时间,包括时区
timestamp [ with time zone ] 日期/时间

兼容性: 下列类型(或者那样拼写的)是 SQL 声明的: bitbit varyingbooleancharcharactercharacter varyingvarchardatedouble precisionintegerintervalnumericdecimalrealsmallinttimetimestamp (包括有时区和无时区的).

绝大多数与基本类型(如:整数和浮点数)对应的输入输出函数都会做错误检查. 出于改善执行性能的考虑, 一些操作符和函数(如加法和乘法)并不做运行时的错误检查. 因而在一些系统上的对某些数据类型的数字操 作会导致轻微的数值溢出或下溢。

要注意的是一些输入输出函数是不可逆的.也就是说, 一个输出函数的输出结果与输入的数据相比可能会丢失 精度。

3.1. 数值类型

数值类型由 2 ,4 或 8 字节的整数以及 4 或 8 字节的浮点数和固定精度小数组成。

Table 3-2. 数值类型

数值类型存储空间描述范围
smallint2 字节固定精度-32768 到 +32767
integer4 字节常用的固定精度数-2147483648 到 +2147483647
bigint8 字节极大范围的固定精度数字大约 18 位数字
decimal变长用户声明精度无限制
numeric变长用户声明精度无限制
real4 字节变精度6 位十进制数字
double precision8 字节变精度15 位十进制数字
serial4 字节标识或交叉索引0 到 +2147483647

数值类型常量的语法在 Section 1.1.2 里描述. 数值类型对应有一套完整的数学操作符和函数.相关信息请参考 Chapter 4

bigint 类型因为是要靠编译器来支持八字节整数的, 因而可能无法在所有平台上得到支持。

3.1.1. Serial(序列)类型

serial 类型是 Postgres 用其他现有的部件构造出来的一种特殊的类型.典型的应用是创建表的唯一 标识,在目前的实现中,下面一句话:

CREATE TABLE tablename (colname SERIAL);
     
等价于声明下面几句话:
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename
    (colname integer DEFAULT nextval('tablename_colname_seq');
CREATE UNIQUE INDEX tablename_colname_key on tablename (colname);
     

Caution

创建为 serial 类型的隐含序列号在删除表时 不会自动删除。

在删除一个包含 serial 类型的表的时候,隐含的支持 serial 的序列号不会被自动删除。 因此下面顺序执行的命令将是无效的:
CREATE TABLE tablename (colname SERIAL);
DROP TABLE tablename;
CREATE TABLE tablename (colname SERIAL);
     
除非明确地使用 DROP SEQUENCE命令, 序列号不会被删掉而是一直在数据库里面。