PostgerSQL常⽤类型整理⼀、数值类型:
下⾯是PostgreSQL所⽀持的数值类型的列表和简单说明:
名字存储空
描述范围
smallint  2 字节⼩范围整数-32768 到 +32767
integer  4 字节常⽤的整数-2147483648 到 +2147483647
bigint8 字节⼤范围的整数-9223372036854775808 到9223372036854775807
decimal变长⽤户声明精度,精
⽆限制
numeric变长⽤户声明精度,精
⽆限制
real  4 字节变精度,不精确  6 位⼗进制数字精度
double8 字节变精度,不精确15 位⼗进制数字精度
serial  4 字节⾃增整数  1 到 +2147483647
bigserial8 字节⼤范围的⾃增整数  1 到 9223372036854775807
1. 整数类型:
类型smallint、integer和bigint存储各种范围的全部是数字的数,也就是没有⼩数部分的数字。试图存储超出范围以外的数值将导致⼀个错误。常⽤的类型是integer,因为它提供了在范围、存储空间和性能之间的最佳平衡。⼀般只有在磁盘空间紧张的时候才使⽤smallint。⽽只有在integer的范围不够的时候才使⽤bigint,因为前者(integer)绝对快得多。
2. 任意精度数值:
类型numeric可以存储最多1000位精度的数字并且准确地进⾏计算。因此⾮常适合⽤于货币⾦额和其它要求计算准确的数量。不
过,numeric类型上的算术运算⽐整数类型或者浮点数类型要慢很多。
numeric字段的最⼤精度和最⼤⽐例都是可以配置的。要声明⼀个类型为numeric的字段,你可以⽤下⾯的语法:
NUMERIC(precision,scale)
⽐如数字23.5141的精度为6,⽽刻度为4。
在⽬前的PostgreSQL版本中,decimal和numeric是等效的。
3. 浮点数类型:
数据类型real和double是不准确的、牺牲精度的数字类型。不准确意味着⼀些数值不能准确地转换成内部格式并且是以近似的形式存储的,因此存储后再把数据打印出来可能显⽰⼀些缺失。
4. Serial(序号)类型:
serial和bigserial类型不是真正的类型,只是为在表中设置唯⼀标识做的概念上的便利。
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约束避免意外地插⼊重复的数值,但这个不是⾃动发⽣的。因此,如果你希望⼀个序列字段有⼀个唯⼀约束或者⼀个主键,那么你现在必须声明,就像其它数据类型⼀样。
还需要另外说明的是,⼀个serial类型创建的序列在其所属字段被删除时,该序列也将被⾃动删除,但是其它情况下是不会被删除的。因此,如果你想⽤同⼀个序列发⽣器同时给⼏个字段提供数据,那么就应该以独⽴对象的⽅式创建该序列发⽣器。
⼆、字符类型:
下⾯是PostgreSQL所⽀持的字符类型的列表和简单说明:
名字描述
varchar(n)变长,有长度限制
char(n)定长,不⾜补空⽩
text变长,⽆长度限制
SQL 定义了两种基本的字符类型,varchar(n)和char(n),这⾥的n是⼀个正整数。两种类型都可以存储最多n个字符长的字串,试图存储更长的字串到这些类型的字段⾥会产⽣⼀个错误,除⾮超出长度的字符都是空⽩,这种情况下该字串将被截断为最⼤长度。如果没有长度声明,char等于char(1),⽽varchar则可以接受任何长度的字串。
MyTest=> CREATE TABLE testtable(first_col varchar(2));
CREATE TABLE
varchar2最大长度MyTest=> INSERT INTO testtable VALUES('333');  --插⼊字符串的长度,超过其字段定义的长度,因此报错。
ERROR:  value too long for type character varying(2)
--插⼊字符串中,超出字段定义长度的部分是空格,因此可以插⼊,但是空⽩符被截断。
MyTest=> INSERT INTO testtable VALUES('33 ');
INSERT 0 1
MyTest=> SELECT * FROM testtable;
first_col
-----------
33
(1 row)
这⾥需要注意的是,如果是将数值转换成char(n)或者varchar(n),那么超长的数值将被截断成n个字符,⽽不会抛出错误。
MyTest=> select 1234::varchar(2);
varchar
---------
12
(1 row)
最后需要提⽰的是,这三种类型之间没有性能差别,只不过是在使⽤char类型时增加了存储尺⼨。虽然在某些其它的数据库系统
⾥,char(n)有⼀定的性能优势,但在PostgreSQL⾥没有。在⼤多数情况下,应该使⽤text或者varchar。
三、⽇期/时间类型:
下⾯是PostgreSQL所⽀持的⽇期/时间类型的列表和简单说明:
名字存储空
描述最低值最⾼值分辨率
timestamp[⽆时
区]
8字节包括⽇期和时间4713 BC5874897AD1毫秒/14位
timestamp[含时区]8字节
⽇期和时间,带时
4713 BC5874897AD1毫秒/14位
interval12字节时间间隔-178000000
178000000年1毫秒/14位
date4字节只⽤于⽇期4713 BC32767AD1天
time[⽆时区]8字节只⽤于⼀⽇内时间00:00:0024:00:001毫秒/14位
1. ⽇期/时间输⼊:
任何⽇期或者时间的⽂本输⼊均需要由单引号包围,就象⼀个⽂本字符串⼀样。
1). ⽇期:
以下为合法的⽇期格式列表:
例⼦描述
January 8,
1999
在任何datestyle输⼊模式下都⽆歧义
1999-01-
08
ISO-8601格式,任何⽅式下都是1999年1⽉8号,(建议格式)
1/8/1999歧义,在MDY下是1⽉8号;在 DMY模式下读做8⽉1⽇
1/18/1999在MDY模式下读做1⽉18⽇,其它模式下被拒绝
01/02/03MDY模式下的2003年1⽉2⽇;DMY模式下的2003年2⽉1⽇;YMD 模式下的2001年2⽉3⽇
1999-Jan-
08
任何模式下都是1⽉8⽇
Jan-08-
1999
任何模式下都是1⽉8⽇
08-Jan-
1999
任何模式下都是1⽉8⽇
99-Jan-08在YMD模式下是1⽉8⽇,否则错误
08-Jan-991⽉8⽇,除了在YMD模式下是错误的之外
Jan-08-991⽉8⽇,除了在YMD模式下是错误的之外
19990108ISO-8601; 任何模式下都是1999年1⽉8⽇
990108ISO-8601; 任何模式下都是1999年1⽉8⽇
2). 时间:
以下为合法的时间格式列表:
例⼦描述
04:05:06.789ISO 8601
04:05:06ISO 8601
04:05ISO 8601
040506ISO 8601
04:05 AM与04:05⼀样;AM不影响数值
04:05 PM与16:05⼀样;输⼊⼩时数必须 <= 12
04:05:06.789-8ISO 8601
04:05:06-08:00ISO 8601
04:05-08:00ISO 8601
040506-08ISO 8601
3). 时间戳:
时间戳类型的有效输⼊由⼀个⽇期和时间的联接组成,后⾯跟着⼀个可选的时区。因此,1999-01-08 04:05:06和1999-01-08 04:05:06 -8:00都是有效的数值。
2. ⽰例:
1). 在插⼊数据之前先查看datestyle系统变量的值:
MyTest=> show datestyle;
DateStyle
-----------
ISO, YMD
(1 row)
2). 创建包含⽇期、时间和时间戳类型的⽰例表:
MyTest=> CREATE TABLE testtable (id integer, date_col date, time_col time, timestamp_col timestamp);
CREATE TABLE
3). 插⼊数据:
MyTest=> INSERT INTO testtable(id,date_col) VALUES(1, DATE'01/02/03');  --datestyle为YMD
INSERT 0 1
INSERT 0 1
MyTest=> SELECT id, date_col FROM testtable;
id  |  date_col
----+------------
1  | 2001-02-03
(1 row)
MyTest=> set datestyle = MDY;
SET
MyTest=> INSERT INTO testtable(id,date_col) VALUES(2, DATE'01/02/03');  --datestyle为MDY
INSERT 0 1
MyTest=> SELECT id,date_col FROM testtable;
id  |  date_col
-
---+------------
1  | 2001-02-03
2  | 2003-01-02
MyTest=> INSERT INTO testtable(id,time_col) VALUES(3, TIME'10:20:00');  --插⼊时间。
INSERT 0 1
MyTest=> SELECT id,time_col FROM testtable WHERE time_col IS NOT NULL;
id  | time_col
----+----------
3  | 10:20:00
(1 row)
MyTest=> INSERT INTO testtable(id,timestamp_col) VALUES(4, DATE'01/02/03');
INSERT 0 1
MyTest=> INSERT INTO testtable(id,timestamp_col) VALUES(5, TIMESTAMP'01/02/03 10:20:00');
INSERT 0 1
MyTest=> SELECT id,timestamp_col FROM testtable WHERE timestamp_col IS NOT NULL;
id  |    timestamp_col
----+---------------------
4  | 2003-01-02 00:00:00
5  | 2003-01-02 10:20:00
(2 rows)
四、布尔类型:
PostgreSQL⽀持标准的SQL boolean数据类型。boolean只能有两个状态之⼀:真(True)或 假(False)。该类型占⽤1个字节。    "真"值的有效⽂本值是:
TRUE
't'
'true'
'y'
'yes'
'1'
⽽对于"假"⽽⾔,你可以使⽤下⾯这些:
FALSE
'f'
'false'
'n'
'no'
'0'
  见如下使⽤⽅式:
MyTest=> CREATE TABLE testtable (a boolean, b text);
CREATE TABLE