Postgres 有着丰富的数据类型可用. 用户可以使用 CREATE TYPE命令为 Postgres 增加新的数据类型.
Table 3-1 显示了所有用户可以使用的 普通数据类型.在“别名”列里列出的大多数可选名字 都是因历史原因 Postgres 在内部使用的 名字.另外,还有一些内部使用的或者废弃的类型也可以用, 但在这里没有文档. 许多内建的数据类型有明确的外部格式.但是,有一些数据类型或者是 Postgres 特有的,如开放和闭合路径, 或者是有几种可能格式的类型,如日期和时间类型.
类型名字 | 别名 | 描述 |
---|---|---|
bigint | int8 | 有符号 8 字节整数 |
bit | 定长位串 | |
bit varying(n) | varbit(n) | 变长位串 |
boolean | bool | 逻辑布尔量 (真/假) |
box | 二维平面中的长方形 | |
character(n) | char(n) | 定长字符串 |
character varying(n) | varchar(n) | 变长字符串 |
cidr | IP 网络地址 | |
circle | 二维平面中的圆 | |
date | 日历日期(年,月,日) | |
double precision | float8 | 双精度浮点数字 |
inet | IP 网络或主机地址 | |
integer | int,int4 | 四字节长有符号整数 |
interval | 通用的时间间隔 | |
line | 二维平面中的无限长直线 | |
lseg | 二维平面中的线段 | |
macaddr | MAC 地址 | |
money | 美国风格的货币类型 | |
numeric(p, s) | decimal(p, s) | 可选精度的准确数字 |
oid | 对象标识符 | |
path | 二维平面的开放的或封闭的几何路径 | |
point | 二维平面中的点 | |
polygon | 二维平面中的封闭几何路径 | |
real | float4 | 单精度浮点数 |
smallint | int2 | 有符号两字节整数 |
serial | 自增四字节整数 | |
text | 变长字符串 | |
time [ without time zone ] | 一天里的时间 | |
time with time zone | 一天里的时间,包括时区 | |
timestamp [ with time zone ] | 日期/时间 |
兼容性: 下列类型(或者那样拼写的)是 SQL 声明的: bit,bit varying,boolean, char,character,character varying,varchar,date, double precision,integer, interval,numeric,decimal, real,smallint,time, timestamp (包括有时区和无时区的).
绝大多数与基本类型(如:整数和浮点数)对应的输入输出函数都会做错误检查. 出于改善执行性能的考虑, 一些操作符和函数(如加法和乘法)并不做运行时的错误检查. 因而在一些系统上的对某些数据类型的数字操 作会导致轻微的数值溢出或下溢。
要注意的是一些输入输出函数是不可逆的.也就是说, 一个输出函数的输出结果与输入的数据相比可能会丢失 精度。
数值类型由 2 ,4 或 8 字节的整数以及 4 或 8 字节的浮点数和固定精度小数组成。
Table 3-2. 数值类型
数值类型 | 存储空间 | 描述 | 范围 |
---|---|---|---|
smallint | 2 字节 | 固定精度 | -32768 到 +32767 |
integer | 4 字节 | 常用的固定精度数 | -2147483648 到 +2147483647 |
bigint | 8 字节 | 极大范围的固定精度数字 | 大约 18 位数字 |
decimal | 变长 | 用户声明精度 | 无限制 |
numeric | 变长 | 用户声明精度 | 无限制 |
real | 4 字节 | 变精度 | 6 位十进制数字 |
double precision | 8 字节 | 变精度 | 15 位十进制数字 |
serial | 4 字节 | 标识或交叉索引 | 0 到 +2147483647 |
数值类型常量的语法在 Section 1.1.2 里描述. 数值类型对应有一套完整的数学操作符和函数.相关信息请参考 Chapter 4。
bigint 类型因为是要靠编译器来支持八字节整数的, 因而可能无法在所有平台上得到支持。
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 类型的隐含序列号在删除表时 不会自动删除。 |
CREATE TABLE tablename (colname SERIAL); DROP TABLE tablename; CREATE TABLE tablename (colname SERIAL);除非明确地使用 DROP SEQUENCE命令, 序列号不会被删掉而是一直在数据库里面。