PostgreSQL 有着丰富的数据类型可用。 用户可使用 CREATE TYPE 命令为 PostgreSQL 增长新的数据类型。数据库
Table 8-1 显示了全部内置的普通数据类型。 在"别名"列里列出的大多数可选名字都是因历史缘由 PostgreSQL 在内部使用的名字。 另外,还有一些内部使用的或者废弃的类型也能够用,但没有在这里列出。数组
Table 8-1. 数据类型网络
名字 | 别名 | 描述 |
---|---|---|
bigint | int8 | 有符号 8 字节整数 |
bigserial | serial8 | 自增八字节整数 |
bit [ (n) ] | 定长位串 | |
bit varying [ (n) ] | varbit | 变长位串 |
boolean | bool | 逻辑布尔量 (真/假) |
box | 平面中的长方形 | |
bytea | 二进制数据("字节数组") | |
character varying [ (n) ] | varchar [ (n) ] | 变长字符串 |
character [ (n) ] | char [ (n) ] | 定长字符串 |
cidr | IPv4 或者 IPv6 网络地址 | |
circle | 平面中的圆 | |
date | 日历日期(年,月,日) | |
double precision | float8 | 双精度浮点数字 |
inet | IPv4 或者 IPv6 网络地址 | |
integer | int,int4 | 四字节长有符号整数 |
interval [ (p) ] | 时间间隔 | |
line | 平面中的无限长直线 | |
lseg | 平面中的线段 | |
macaddr | MAC 地址 | |
money | 货币金额 | |
numeric [ (p, s) ] | decimal [ (p, s) ] | 可选精度的准确数字 |
path | 平面中的几何路径 | |
point | 平面中的点 | |
polygon | 平面中的封闭几何路径 | |
real | float4 | 单精度浮点数 |
smallint | int2 | 有符号两字节整数 |
serial | serial4 | 自增四字节整数 |
text | 变长字符串 | |
time [ (p) ] [ without time zone ] | 一天里的时间 | |
time [ (p) ] with time zone | timetz | 一天里的时间,包括时区 |
timestamp [ (p) ] [ without time zone ] | 日期和时间 | |
timestamp [ (p) ] with time zone | timestamptz | 日期和时间 |
兼容性: 下列类型(或者那样拼写的)是SQL声明的: bit,bit varying,boolean, char,character,character varying,varchar,date, double precision,integer, interval,numeric,decimal, real,smallint,time (包括有时区和无时区的), timestamp (包括有时区和无时区的)。函数
每种数据类型都有一个由其输入和输出函数决定的外部表现形式。 许多内建的类型有明显的格式。不过,许多类型要么是 PostgreSQL 所特有的,好比几何路径,要么多是有几种不一样的格式,好比日期和时间类型。 有些输入和输出函数是不可逆的。也就是说,输出函数的输出结果和原始的输入比较的时候可能丢失精度。性能
数值类型由二、4或8字节的整数以及4或8字节的浮点数和可选精度小数组成。 Table 8-2 列出了全部可用类型。spa
Table 8-2. 数值类型操作系统
名字 | 存储空间 | 描述 | 范围 |
---|---|---|---|
smallint | 2 字节 | 小范围整数 | -32768 到 +32767 |
integer | 4 字节 | 经常使用的整数 | -2147483648 到 +2147483647 |
bigint | 8 字节 | 大范围的整数 | -9223372036854775808 到 9223372036854775807 |
decimal | 变长 | 用户声明精度,精确 | 无限制 |
numeric | 变长 | 用户声明精度,精确 | 无限制 |
real | 4 字节 | 变精度,不精确 | 6 位十进制数字精度 |
double precision | 8 字节 | 变精度,不精确 | 15 位十进制数字精度 |
serial | 4 字节 | 自增整数 | 1 到 +2147483647 |
bigserial | 8 字节 | 大范围的自增整数 | 1 到 9223372036854775807 |
数值类型常量的语法在 Section 4.1.2 里描述。 数值类型对应有一套完整的数学操做符和函数。相关信息请参考 Chapter 9。 下面的几节详细描述这些类型。对象
类型 smallint,integer,和 bigint 存储各类范围的所有是数字的数,也就是没有小数部分的数字。 试图存储超出范围之外的数值将致使一个错误。ci
经常使用的类型是 integer,由于它提供了在范围,存储空间, 和性能之间的最佳平衡。通常只有在磁盘空间紧张的时候才使用 smallint。而只有在 integer 的范围不够的时候才使用 bigint,由于前者绝对快得多。字符串
bigint 类型可能不是在全部平台上都运转正确, 由于它依赖编译器对八字节整数的支持。在那些没有这样支持的机器上, bigint 的做用和 integer 同样(可是仍然占据八字节存储)。不过,咱们还不知道任何有这样的状况的平台。
SQL只声明了整数类型 integer(或int)和 smallint。类型 bigint,和类型名 int2,int4,和 int8 都是扩展, 也在许多其它 SQL 数据库系统中使用。
类型 numeric 能够存储最多1000位精度的数字而且准确地进行计算。 咱们特别建议将它用于货币金额和其它要求计算准确的数量。不过,numeric 类型上的算术运算比整数类型或者咱们下一节描述的浮点数类型要慢不少。
在随后的内容里,咱们使用了下述术语: 一个 numeric 的比例是到小数点右边为止小数部分的位数, numeric 的精度是整个数字里所有数据位的数目,也就是小数点两边的数据数目。 所以数字 23.5141 的精度为6而比例为4。你能够认为整数的比例为零。
numeric 字段的最大精度和最大比例都是能够配置的。要声明一个类型为 numeric 的字段,你能够用下面的语法
NUMERIC(precision, scale)
精度必须为正数,比例能够为零或者正数。 另外,
NUMERIC(precision)
选择了 0 为比例。不带任何精度或者比例声明
NUMERIC
则建立一个能够存储一个直到实现精度上限的任意精度和比例的数值, 一个这样类型的字段将不会把输入数值转化成任何特定的比例, 而带有比例声明的 numeric 字段将把输入值转化为该比例。 (SQL标准要求缺省的比例是 0。也就是转化成整数精度。 咱们以为这样作有点没用。若是你关心移植性,那你最好老是明确声明精度和比例。)
若是一个要存储的数值的比例比字段声明的比例高, 那么系统将尝试圆整(四舍五入)该数值到指定的小数位。 而后,若是小数点左边的数据位数超过了声明的精度减去声明的比例, 那么抛出一个错误。
数值数据值物理上是不带任何前导或者后缀零的形式存储的。 所以,字段上声明的精度和比例都是最大值,而不是固定分配的。 (在这个方面,numeric 类型更相似于 varchar(n), 而不像 char(n)。) 实际存储是每四个十进制位两个字节,而后在整个数据上加上八个字节的额外开销。
除了普通的数字值以外,numeric 类型容许特殊值 NaN, 表示"不是一个数字"。任何在 NaN 上面的操做都生成另一个 NaN。 若是在 SQL 命令里把这些值看成一个常量写,你必须在其周围放上单引号,好比 UPDATE table SET x = 'NaN'。在输入时,字串 NaN看成大小写无关看待。
类型 decimal 和 numeric 是等效的。 两种类型都是SQL标准。
数据类型 real 和 double precision 是不许确的,变精度的数字类型。 实际上,这些类型是 IEEE 标准 754 二进制浮点数算术(分别对应单和双精度)的通常实现, 外加下层处理器,操做系统和编译器对它的支持。
不许确意味着一些数值不能准确地转换成内部格式而且是以近似的形式存储的,所以存储而后把数据再打印出来可能显示一些缺失。 处理这些错误以及这些错误是如何在计算中传播的属于数学和计算机科学的一个完整的分支, 咱们不会在这里进一步讨论它,这里的讨论仅限于以下几点:
若是你要求准确的计算(好比计算货币金额),应使用 numeric 类型。
若是你想用这些类型作任何重要的复杂计算,尤为是那些你对范围状况(无穷,下溢)严重依赖的事情,那你应该仔细评诂你的实现。
拿两个浮点数值进行相等性比较可能象,也可能不象想像那样运转。
一般,real 类型的范围是至少 -1E+37 到 +1E+37, 精度至少是 6 位小数。double precision 类型一般有 -1E+308 到 +1E+308 的范围,精度是至少 15 位数字。太大或者过小的数值都会致使错误。 若是输入数据过高,那么可能发生园整。太接近零的数字,若是没法与零值的表现形式相区分就会产生下溢错。
除了普通的数字值以外,浮点类型还有几个特殊值:
Infinity
-Infinity
NaN
PostgreSQL 还支持 SQL 标准表示法 float 和 float(p) 用于声明非精确的数值类型。 在这里,p 声明以二进制位表示的最低可接受精度。 在选取 real 类型的时候,PostgreSQL 接受 float(1) 到 float(24),在选取 double precision 的时候,接受 float(25) 到 float(53)。在容许范围以外的 p 值将致使一个错误。 没有声明精度的 float 将被看成是 double precision。
注意: 在 PostgreSQL 7.4 之前,在 float(p) 里面的精度会被看成是这么多位数的十进制位。到 7.4 已经被修改为与 SQL 标准匹配,标准声明这个精度是以二进制位度量的。假设 real 和 double precision 分别有 24 和 53 个二进制位的位数对 IEEE 标准的浮点实现来讲是正确的。 在非 IEEE 平台上,这个数值可能略有误差,可是为了简化,咱们在全部平台上都用了一样的 p 值范围。
serial 和 bigserial 类型不是真正的类型, 只是为在表中设置惟一标识作的概念上的便利。(相似其它一些数据库中的 AUTO_INCREMENT 属性)。 在目前的实现中,下面一句话:
CREATE TABLE tablename ( colname SERIAL );
等价于声明下面几句话:
CREATE SEQUENCE tablename_colname_seq; CREATE TABLE tablename( colname integer DEFAULT nextval('tablename_colname_seq') NOT NULL );
所以,咱们就建立了一个整数字段而且把它的缺省数值安排为从一个序列发生器取值。 应用了一个 NOT NULL 约束以确保空值不会被明确地插入。 在大多数状况下你可能还但愿附加一个 UNIQUE 或者 PRIMARY KEY 约束避免意外地插入重复的数值,但这个不是自动发生的。
注意: 在 PostgreSQL 7.3 之前,serial 隐含 UNIQUE。但如今再也不如此。 若是你但愿一个序列字段有一个惟一约束或者一个主键,那么你如今必须声明,就像其它数据类型同样。
要使用 serial 字段插入序列的下一个数值到表中, 主要是要注意 serial 应该赋予缺省值。 咱们能够经过在 INSERT 语句中把该字段排除在字段列表以外来实现, 也能够经过使用 DEFAULT 关键字来实现。
类型名 serial 和 serial4 是等效的: 两个都建立 integer 字段。类型名 bigserial 和 serial8 也同样,只不过它建立一个 bigint 字段。 若是你预计在表的生存期中使用的标识数目超过 231 个,那么你应该使用 bigserial。
一个 serial 类型建立的序列在所属的字段被删除的时候自动删除,其它状况下是不会被删除的。 (这一点在 PostgreSQL 版本 7.3 以前可不是真的。请注意,这种自动删除的关联在经过重载 7.3 之前的数据库转储的时候可不会自动发生; 那样的转储文件不包含须要创建这种关联关系的信息。) 另外,这样的序列和字段之间的依赖性只在 serial 字段自己上有; 若是任何其它字段引用了序列(多是手工调用 nextval 函数), 那么,若是这个序列被删除了,它们就会被破坏。咱们认为这样使用 serial 字段是一种很差的形式;若是你想用同一个序列发生器给几个字段喂数据,那么仍是把序列发生器做为独立对象建立。