PostgreSql常见数据类型
1.CREATE TYPE 命令增加新的数据类型
2.数据类型
名字别名描述
bigint int8有符号 8 字节整数bigserial serial8⾃增 8 字节整数
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有符号 4 字节整数interval [ (p) ]时间间隔
line平⾯中的⽆限长直线lseg平⾯中的线段macaddr MAC 地址
money货币⾦额
numeric [ (p, s) ]decimal [ (p, s) ]可选精度的准确数字path平⾯中的⼏何路径point平⾯中的点
polygon平⾯中的封闭⼏何路径real float4单精度浮点数
smallint int2有符号 2 字节整数serial serial4⾃增 4 字节整数
text变长字符串
time [ (p) ] [ without time zone ]⼀天中的时间
time [ (p) ] with time zone timetz⼀天⾥的时间,包括时区timestamp [ (p) ] [ without time zone ]⽇期和时间timestamp [ (p) ] with time zone timestamptz⽇期和时间,包括时区
timestamp [ (p) ] with time zone timestamptz
名字别名描述
3.数值类型
名字存储空间描述范围
smallint  2 字节⼩范围整数-32768 到 +32767
integer  4 字节常⽤的整数-2147483648 到 +2147483647
bigint8 字节⼤范围的整数-9223372036854775808 到 9223372036854775807
decimal变长⽤户声明精度,精确⽆限制
numeric变长⽤户声明精度,精确⽆限制
real  4 字节变精度,不精确  6 位⼗进制数字精度
double precision8 字节变精度,不精确15 位⼗进制数字精度
serial  4 字节⾃增整数  1 到 2147483647
bigserial8 字节⼤范围的⾃增整数  1 到 9223372036854775807
3. 整数类型
smallint, integer, bigint 类型存储各种范围的全部是数字的数,也就是没有⼩数部分的数字。试图存储超出范围以外的数值将导致⼀个错误。
常⽤的类型是 integer ,因为它提供了在范围、存储空间、性能之间的最佳平衡。⼀般只有在磁盘空间紧张的时候才使⽤ smallint 。⽽只有在 integer 的范围不够的时候才使⽤ bigint ,因为前者绝对快得多。
bigint 类型可能不是在所有平台上都运转正确,因为它依赖编译器对⼋字节整数的⽀持。在那些没有⼋字节整数⽀持的机器上,bigint 的作⽤和 integer ⼀样(但是仍然占据⼋字节存储)。不过,我们⽬前还没听说过有这样的平台。
SQL 只声明了整数类型 integer(或 int) 和 smallint 。类型 bigint 和类型别名 int2, int4, int8 都是扩展,并且也在许多其它 SQL 数据库系统中使⽤。
4.任意精度数值
numeric 类型可以存储最多 1000 位精度的数字并且准确地进⾏计算。特别建议将它⽤于货币⾦额和其它要求精确计算的场合。不
过,numeric 类型上的算术运算⽐整数类型要慢很多。
术语:⼀个 numeric 类型的标度(scale)是⼩数部分的位数,精度(precision)是全部数据位的数⽬,也就是⼩数点两边的位数总和。因此数字 23.5141 的精度为 6 ⽽标度为 4 。你可以认为整数的标度为零。
numeric 字段的最⼤精度和最⼤标度都是可以配置的。要声明⼀个字段的类型为 numeric ,你可以⽤下⾯的语法:
NUMERIC(precision, scale)
精度必须为正数,标度可以为零或者正数。另外,
NUMERIC(precision)
选择了标度为 0 。不带任何精度与标度的声明
decimal是整数数据类型NUMERIC
则创建⼀个可以存储⼀个直到实现精度上限的任意精度和标度的数值,⼀个这样类型的字段将不会把输⼊数值转化成任何特定的标度,⽽带有标度声明的 numeric 字段将把输⼊值转化为该标度。SQL 标准要求缺省的标度是 0(也就是转化成整数精度)。如果你关⼼移植性,那你最好总是明确声明精度和标度。
如果⼀个要存储的数值的标度⽐字段声明的标度⾼,那么系统将尝试圆整(四舍五⼊)该数值到指定的⼩数位。然后,如果⼩数点左边的数据位数超过了声明的精度减去声明的标度,那么将抛出⼀个错误。
numeric 类型的数据值在物理上是不带任何前导或者后缀零的形式存储的。因此,字段上声明的精度和标度都是最⼤值,⽽不是固定分配的。在这个⽅⾯,numeric 类型更类似于 varchar(n) ⽽不是 char(n) 。实际存储是每四个⼗进制位两个字节,然后在整个数据上加上⼋个字节的额外开销。
除了普通的数字值之外,numeric 类型允许⽤特殊值 NaN 表⽰"不是⼀个数字"。任何在 NaN 上⾯的操作都⽣成另外⼀个 NaN 。如果在SQL 命令⾥把这些值当作⼀个常量写,你必须在其周围放上单引号,⽐如 UPDATE table SET x = 'NaN' 。在输⼊时,字符串 NaN 是⼤⼩写⽆关的。
类型 decimal 和 numeric 是等效的。两种类型都是 SQL 标准。
5.浮点数类型
数据类型 real 和 double precision 是不精确的、变精度的数字类型。
如果你要求精确的计算(⽐如计算货币⾦额),应使⽤ numeric 类型。
如果你想⽤这些类型做任何重要的复杂计算,尤其是那些你对范围情况(⽆穷/下溢)严重依赖的事情,那你应该仔细评诂你的实现。
拿两个浮点数值进⾏相等性⽐较可能像、也可能不像你想像那样运转。
在⼤多数平台上,real 类型的范围是⾄少 1E-37 到 1E+37 ,精度⾄少是 6 位⼩数。double precision 的范围通常是 1E-307 到
1E+308 ,精度是⾄少 15 位数字。太⼤或者太⼩的数值都会导致错误。如果输⼊数据的精度太⾼,那么将会发⽣园整。太接近零的数字,如果⽆法与零值的表现形式相区分就会产⽣下溢错误。
除了普通的数字值之外,浮点类型还有⼏个特殊值:
Infinity
-Infinity
NaN
这些值分别表⽰ IEEE 754 特殊值"正⽆穷⼤"、"负⽆穷⼤"、"不是⼀个数字"。在不遵循 IEEE 754 浮点算术的机器上,这些值的含义可能不是预期的。如果在 SQL 命令⾥把这些数值当作常量写,你必须在它们周围放上单引号,像这样:UPDATE table SET x = 'Infinity' 。输⼊时,这些值是以⼤⼩写⽆关的⽅式识别的。
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 值范围。
6.序列号类型
serial 和 bigserial 类型不是真正的类型,只是为在表中设置唯⼀标识做的概念上的便利。类似其它⼀些数据库中的 AUTO_INCREMENT 属性。在⽬前的实现中,下⾯⼀个语句:
CREATE TABLE tablename (
colname SERIAL
);
等价于声明下⾯⼏个语句:
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED lname;
因此,我们就创建了⼀个整数字段并且把它的缺省数值安排为从⼀个序列发⽣器读取。应⽤了⼀个 NOT NULL 约束以确保 NULL 不会被插⼊。在⼤多数情况下你可能还希望附加⼀个 UNIQUE 或 PRIMARY KEY 约束避免意外地插⼊重复的数值,但这个不是⾃动的。最后,将序列发⽣器"从属于"那个字段,这样当该字段或表被删除的时候也⼀并删除它。
【注意】PostgreSQL 7.3以前,serial 隐含 UNIQUE 。但现在不再如此。如果你希望⼀个序列字段有⼀个唯⼀约束或者⼀个主键,那么你现在必须声明,就像其它数据类型⼀样。
要在 serial字段中插⼊序列中的下⼀个数值,主要是要注意 serial字段应该赋予缺省值。我们可以通过在 INSERT 语句中把该字段排除在字段列表之外来实现,也可以通过使⽤ DEFAULT 关键字来实现。
类型名 serial 和 serial4 是等效的:两者都创建 integer 字段。类型名 bigserial 和 serial8 也⼀样,只不过它创建⼀个 bigint 字段。如果你预计在表的⽣存期中使⽤的标识数⽬可能超过 231 个,那么你应该使⽤ bigserial 。
⼀个 serial 类型创建的序列在所属的字段被删除的时候⾃动删除。你可以只删除序列⽽不删除字段,不过这将删除该字段的缺省值表达式。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。