PostgreSQL
支持的数据类型远比其他数据库要多;
类型输入与转换
select int '1', date '2015-12-6';
select '1'::int, '2015-12-6'::date;
布尔类型
t | TRUE
f | FALSE
t| tRue
f | fAlSe
t | 'true'
f | 'false'
t | 't'
f | 'f'
t | 'y'
f | 'n'
t | 'yes'
f | 'no'
t | '1'
f | '0' //注意没有数值0,1
- 操作符
and, or, not
- 比较运算符:
is
expression is true;
expression is not true;
expression is unknown;
.......
数值类型
名称 |
存储(字节) |
类型 |
范围 |
smallint/int2 |
2 |
整数 |
-215~214 |
int |
4 |
整数 |
-231-230 |
bigint/int8 |
8 |
整数 |
-263-261 |
numeric/decimal |
|
精确小数 |
无限制 |
real/float4 |
4 |
浮点数 |
6位十进制 |
double precision/float8/float |
8 |
浮点数 |
15位十进制 |
serial |
4 |
序列 |
1~2^21-1 |
bigserial |
8 |
序列 |
1~2^63-1 |
money |
8 |
货币 |
-92233720368547758.08~92233720368547758.07 |
numeric/decimal
用于货币计算等要求精确的场合;定义此类型: numeric(precision精度, scale标度)
- 序列类型用于自增,默认从1开始;
//定义一个自增id的表
create table ids (id serial primary key);
- 货币类型可以储存固定小数的货币数目,与浮点数不同,保证精度;
- 货币类型的格式由
lc_monetary
决定;查看: show lc_monetary;
,修改: set lc_monetary = 'en_US.UTF_8'
- 数学函数;
- 数学操作符;
字符串类型
名称 |
长度 |
varchar(n) |
变长,4+实际长度,最大1GB |
char(n) |
定长,4+n,不足补空白,最大1GB |
text |
变长,无限制 |
二进制数据类型
- 只有一种:
bytea
;
- 允许存储二进制字符串,和普通字符串的区别:
* 可以存储字节零值和其他不可打印的字节;
* 二进制字符串的处理实际就是处理字节,字符串处理则取决于区域设计; 即二进制字符串适合存储是‘原始字节’的数据, 如图片,而字符串适合文本;
位串类型
bit(n)
: 必须精准匹配长度,存储过短或过长都会报错;
bit varying(n)
: 变长;
日期/时间类型
名称 |
存储空间(字节) |
描述 |
最低值 |
最高值 |
分辨率 |
date |
4 |
只用于日期 |
4713BC |
5874897AD |
1天 |
interval[(p)] |
12 |
时间间隔 |
-178000000年 |
178000000年 |
1毫秒 |
time[(p)] |
8 |
只用于一日内时间 |
00:00:00 |
24:00:00 |
1毫秒 |
time[(p)] with the zone |
12 |
带时区 |
00:00:00+1459 |
24:00:00-1459 |
1毫秒 |
timestamp[(p)] |
8 |
日期和时间 |
4713BC |
5874897AD |
1毫秒 |
timestamp[(p)] with the zone |
12 |
带时区 |
4713BC |
5874897AD |
1毫秒 |
- 可选精确值p指明小数位数,范围[0~6],默认6位;
- 在
SQL
中任何日期时间的文本输入都需要由类型加单引号字符串组成: type [(p)] 'value'
;
- 日期date可以以很多格式输入,常用格式与表示格式为:
year-month-day
;
- 时间字符串常用输入格式和表示格式为:
hh:mm:ss
;
枚举类型
- 一个包含一系列有序的静态值集合的数据类型; 输入的字符串不在枚举类型之间会报错;
- 大小敏感,枚举值4字节,其文本长度至少63字节;
- 使用前先要用
create type
创建一个枚举类型
create type week as enum ('sum', 'mon', 'tues', 'wed', 'thur', 'fri'. 'sat');
create table duty(name text, day week);
insert into duty values('jinks', 'mon');
- 使用
dT
查看枚举类型的定义;
- 枚举类型具体值都是定义在表
pg_enum
中,可以直接操作;
几何类型
名称 |
存储空间(字节) |
描述 |
形式 |
point |
16 |
点 |
(x,y) |
line |
32 |
直线 |
((x1,y1),(x2,y2)) |
lseg |
32 |
线段 |
((x1,y1),(x2,y2)) |
box |
32 |
矩形 |
((x1,y1),(x2,y2)) |
path |
16+16*n |
闭合路径 |
((x1,y1)...) |
path |
16+16*n |
开发路径 |
[(x1,y1)...] |
polygon |
40+16n |
多边形 |
((x1,y1)...) |
circle |
24 |
圆 |
<(x,y),r> |
网络地址类型
名称 |
存储空间(字节) |
描述 |
cidr |
7/19 |
IPv4或IPv5的网络地址 |
inet |
7/19 |
IPv4或IPv5的网络地址或主机地址 |
macaddr |
6 |
以太网MAC地址 |