来源:http://www.postgres.cn/docs/11/
8.1. 数字类型
数字类型由2、4或8字节的整数以及4或8字节的浮点数和可选精度小数组成。表 8.2列出了所有可用类型。
名字 | 存储尺寸 | 描述 | 范围 |
---|---|---|---|
smallint |
2字节 | 小范围整数 | -32768 to +32767 |
integer |
4字节 | 整数的典型选择 | -2147483648 to +2147483647 |
bigint |
8字节 | 大范围整数 | -9223372036854775808 to +9223372036854775807 |
decimal |
可变 | 用户指定精度,精确 | 最高小数点前131072位,以及小数点后16383位 |
numeric |
可变 | 用户指定精度,精确 | 最高小数点前131072位,以及小数点后16383位 |
real |
4字节 | 可变精度,不精确 | 6位十进制精度 |
double precision |
8字节 | 可变精度,不精确 | 15位十进制精度 |
smallserial |
2字节 | 自动增加的小整数 | 1到32767 |
serial |
4字节 | 自动增加的整数 | 1到2147483647 |
bigserial |
8字节 | 自动增长的大整数 |
1到9223372036854775807 |
8.1.1. 整数类型
常用的类型是integer
,因为它提供了在范围、存储空间和性能之间的最佳平衡。一般只有在磁盘空间紧张的时候才使用 smallint
类型。而只有在integer
的范围不够的时候才使用bigint
。
8.1.2. 任意精度数字
一个numeric
的precision(精度)是整个数中有效位的总数,也就是小数点两边的位数。numeric
的scale(刻度)是小数部分的数字位数,也就是小数点右边的部分。因此数字 23.5141 的精度为6而刻度为4。可以认为整数的刻度为零。
numeric
列的最大精度和最大比例都是可以配置的。
除了普通的数字值之外,numeric
类型允许特殊值NaN
, 表示“不是一个数字”。任何在 NaN
上面的操作都生成另外一个NaN
。
类型decimal
和numeric
是等效的。两种类型都是SQL标准的一部分。
8.1.4. 序数类型
smallserial
、serial
和bigserial
类型不是真正的类型,它们只是为了创建唯一标识符列而存在的方便符号(类似其它一些数据库中支持的AUTO_INCREMENT
属性)。
8.3. 字符类型
表 8.4. 字符类型
名字 | 描述 |
---|---|
character varying( , varchar( |
有限制的变长 |
character( , char( |
定长,空格填充 |
text |
无限变长 |
表 8.4显示了在PostgreSQL里可用的一般用途的字符类型。
varchar(
和n
)char(
的概念分别是n
)character varying(
和n
)character(
的别名。n
)
没有长度声明词的character
等效于character(1)
。
如果不带长度说明词使用character varying
,那么该类型接受任何长度的串。后者是一个PostgreSQL的扩展。
另外,PostgreSQL提供text
类型,它可以存储任何长度的串。尽管类型text
不是SQL标准,但是许多其它 SQL 数据库系统也有它。
当把一个character
值转换成其他 字符串类型之一时,拖尾的空白会被移除。请注意,在character varying
和text
值里, 结尾的空白语意上是有含义的,并且在使用模式匹配(如LIKE
和正则表达式)时也会被考虑。
8.5. 日期/时间类型
PostgreSQL支持SQL中所有的日期和时间类型,如表 8.9所示。这些数据类型上可用的操作如第 9.9 节所述。日期根据公历来计算,即使对于该历法被引入之前的年份也一样(见第 B.5 节)。
表 8.9. 日期/时间类型
名字 | 存储尺寸 | 描述 | 最小值 | 最大值 | 解析度 |
---|---|---|---|---|---|
timestamp [ ( |
8字节 | 包括日期和时间(无时区) | 4713 BC | 294276 AD | 1微秒 |
timestamp [ ( |
8字节 | 包括日期和时间,有时区 | 4713 BC | 294276 AD | 1微秒 |
date |
4字节 | 日期(没有一天中的时间) | 4713 BC | 5874897 AD | 1日 |
time [ ( |
8字节 | 一天中的时间(无日期) | 00:00:00 | 24:00:00 | 1微秒 |
time [ ( |
12字节 | 仅仅是一天中的时间(没有日期),带有时区 | 00:00:00+1459 | 24:00:00-1459 | 1微秒 |
interval [ |
16字节 | 时间间隔 | -178000000年 | 178000000年 | 1微秒 |
注意
SQL要求只写timestamp
等效于timestamp without time zone
,并且PostgreSQL鼓励这种行为。
timestamptz
被接受为timestamp with time zone
的一种简写,这是一种PostgreSQL的扩展。
time
、timestamp
和interval
接受一个可选的精度值 p
,这个精度值声明在秒域中小数点之后保留的位数。缺省情况下,在精度上没有明确的边界。p
允许的范围是从 0 到 6。
8.6. 布尔类型
PostgreSQL提供标准的SQL类型boolean
,参见表 8.19。boolean
可以有多个状态:“true(真)”、“false(假)”和第三种状态“unknown(未知)”,未知状态由SQL空值表示。
表 8.19. 布尔数据类型
名字 | 存储字节 | 描述 |
---|---|---|
boolean |
1字节 | 状态为真或假 |
“真”状态的有效文字值是:
TRUE |
't' |
'true' |
'y' |
'yes' |
'on' |
'1' |
而对于“假”状态,你可以使用下面这些值:
FALSE |
'f' |
'false' |
'n' |
'no' |
'off' |
'0' |
前导或者末尾的空白将被忽略,并且大小写也无关紧要。使用TRUE
和FALSE
这样的关键词比较好(SQL兼容)。
例 8.2显示了使用字母t
和f
输出boolean
值的例子。
例 8.2. 使用boolean
类型
CREATE TABLE test1 (a boolean, b text); INSERT INTO test1 VALUES (TRUE, 'sic est'); INSERT INTO test1 VALUES (FALSE, 'non est'); SELECT * FROM test1; a | b ---+--------- t | sic est f | non est SELECT * FROM test1 WHERE a; a | b ---+--------- t | sic est
8.15. 数组
PostgreSQL允许一个表中的列定义为变长多维数组。
8.15.1. 数组类型的定义
为了展示数组类型的使用,我们创建这样一个表:
CREATE TABLE sal_emp ( name text, pay_by_quarter integer[], schedule text[][] );
如上所示,一个数组数据类型可以通过在数组元素的数据类型名称后面加上方括号([]
)来命名。
当前的实现也不会强制所声明的维度数。一个特定元素类型的数组全部被当作是相同的类型,而不论其尺寸或维度数。因此,在CREATE TABLE
中声明数组的尺寸或维度数仅仅只是文档而已,它并不影响运行时的行为。
另一种符合SQL标准的语法是使用关键词ARRAY
,可以用来定义一维数组。pay_by_quarter
可以这样定义:
pay_by_quarter integer ARRAY[4],
或者,不指定数组尺寸:
pay_by_quarter integer ARRAY,
但是和前面一样,PostgreSQL在任何情况下都不会强制尺寸限制。
8.15.2. 数组值输入
要把一个数组值写成一个文字常数,将元素值用花括号包围并用逗号分隔。
格式如下:'{ val1 delim val2 delim ... }' 一个数组常量的例子是:'{{1,2,3},{4,5,6},{7,8,9}}'
要设置一个数组常量的一个元素为NULL,在该元素值处写NULL
(任何NULL
的大写或小写变体都有效)。如果你需要一个真正的字符串值“NULL”,你必须在它两边放上双引号。
8.15.3. 访问数组
数组下标写在方括号内。默认情况下,PostgreSQL为数组使用了一种从1开始的编号习惯,即一个具有n
个元素的数组从array[1]
开始,结束于array[
。n
]