PostgreSQL的数据类型
1、数值类型
数值类型由2,4或8字节的整数以及4或8字节的浮点数和可选精度的小数组成。
| 名字 | 存储空间 | 描述 | 范围 |
|---|---|---|---|
| smallint | 2字节 | 小范围整数 | -32768到+32768 |
| 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 |
2、货币类型
money类型存储带有固定小数精度的货币金额,可查阅Table 8-3。 小数精度由lc_monetary的设置来决定。 可以以任意格式输入,包括整型,浮点型,或者典型的货币格式,如'$1,000.00'。 根据区域字符集,输出一般是最后一种形式。 通过将整数值转换成text类型,再转换成money类型的方式, 将不带引号的数值转换成money类型。
SELECT 1234::text::money;balance
在缺少区域语言支持的条件下,反向将money值转换成数值类型是很麻烦的。 如果知道货币符号和千位分隔符,你可以使用regexp_replace():
SELECT regexp_replace('52093.89'::money::text, '[$,]', '', 'g')::numeric;
由于输出的数据类型对语言环境要求很细,因此,lc_monetary设置的不同可能会造成 无法将money数据输入到数据库中。 为了避免这种问题的发生,在向一个新数据库进行转储之前,确保lc_monetary与原数据库相同,或具有等价值。
| 名字 | 存储空间 | 描述 | 范围 |
|---|---|---|---|
| smallint | 2字节 | 小范围整数 | -32768到+32768 |
| integer | 4字节 | 常用的整数 | -2147483648到+2147483647 |
3、字符类型
| 名字 | 描述 |
|---|---|
| character varying(n), varchar(n) | 变长,有长度限制 |
| character(n), char(n) | 定长,不足补空白 |
| text | 变长,无长度限制 |
4、日期/时间类型
| 名字 | 存储空间 | 描述 | 最低值 | 最高值 | 分辨率 |
|---|---|---|---|---|---|
| timestamp [ (p) ] [ without time zone ] | 8字节 | 日期和时间(无时区) | 4713 BC | 294276 AD | 1毫秒/14位 |
| timestamp [ (p) ] with time zone | 8字节 | 日期和时间,带时区 | 4713 BC | 294276 AD | 1毫秒/14位 |
| date | 4字节 | 只用于日期 | 4713 BC | 5874897 AD | 1天 |
| time [ (p) ] [ without time zone ] | 8字节 | 只用于时间 | 00:00:00 | 24:00:00 | 1毫秒/14位 |
| time [ (p) ] with time zone | 12字节 | 只用于一日内时间,带时区 | 00:00:00+1459 | 24:00:00-1459 | 1毫秒/14位 |
| interval [fields] [ (p) ] | 12字节 | 时间间隔 | -178000000年 | 178000000年 | 1毫秒/14位 |
5、布尔类型
PostgreSQL支持SQL标 准的boolean数据类型。 boolean只能有"true"(真)或"false"(假)两个状态之一, 第三种"unknown"(未知)状态,用NULL表示。
| 名称 | 存储格式 | 描述 |
|---|---|---|
| boolean | 1字节 | 真/假 |
真值的有效文本值是:TRUE,t,true,y,yes,on,1
假值的有效文本值是:FALSE,f,false,n,no,off,0
前导或尾随空白将被忽略,大小写无关紧要。
6、枚举类型
枚举类型是一个包含静态和值的有序集合的数据类型。 等于某些编程语言中的enum类型。 一个枚举类型可以是一周中的天,或者一块数据的状态值的集合。
枚举类型的声明
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
枚举类型的使用
CREATE TABLE person (
name varchar(32),
current_mood mood
);
7、几何类型
几何数据类型表示二维的平面物体。
| 名字 | 存储空间 | 说明 | 表现形式 |
|---|---|---|---|
| point | 16字节 | 平面中的点 | (x,y) |
| line | 32字节 | (无穷)直线(未完全实现) | ((x1,y1),(x2,y2)) |
| lseg | 32字节 | (有限)线段 | ((x1,y1),(x2,y2)) |
| box | 32字节 | 矩形 | ((x1,y1),(x2,y2)) |
| path | 16+16n字节 | 闭合路径(与多边形类似 | ((x1,y1),...) |
| path | 16+16n字节 | 开放路径 | [(x1,y1),...] |
| polygon | 40+16n字节 | 多边形(与闭合路径相似) | ((x1,y1),...) |
| circle | 24字节 | 圆 | <(x,y),r> (圆心和半径) |
8、网络地址类型
PostgreSQL提供用于存储 IPv4、IPv6、MAC地址的数据类型。 用这些数据类型存储网络地址比用纯文本类型好, 因为这些类型提供输入错误检查和好些种特殊的操作和功能
| 名字 | 存储空间 | 描述 |
|---|---|---|
| cidr | 7或19字节 | IPv4或IPv6网络 |
| inet | 7或19字节 | IPv4 或 IPv6 网络和主机 |
| macaddr | 6字节 | MAC 地址 |