PosegreSQL基础回顾(第 8 章 数据类型)

来源: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. 任意精度数字

 一个numericprecision(精度)是整个数中有效位的总数,也就是小数点两边的位数。numericscale(刻度)是小数部分的数字位数,也就是小数点右边的部分。因此数字 23.5141 的精度为6而刻度为4。可以认为整数的刻度为零。

numeric列的最大精度和最大比例都是可以配置的。

除了普通的数字值之外,numeric类型允许特殊值NaN, 表示不是一个数字”。任何在 NaN上面的操作都生成另外一个NaN

 类型decimalnumeric是等效的。两种类型都是SQL标准的一部分。

8.1.4. 序数类型

 smallserialserialbigserial类型不是真正的类型,它们只是为了创建唯一标识符列而存在的方便符号(类似其它一些数据库中支持的AUTO_INCREMENT属性)。

8.3. 字符类型

表 8.4. 字符类型

名字 描述
character varying(n)varchar(n) 有限制的变长
character(n)char(n) 定长,空格填充
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 varyingtext值里, 结尾的空白语意上有含义的,并且在使用模式匹配(如LIKE和正则表达式)时也会被考虑。

8.5. 日期/时间类型

PostgreSQL支持SQL中所有的日期和时间类型,如表 8.9所示。这些数据类型上可用的操作如第 9.9 节所述。日期根据公历来计算,即使对于该历法被引入之前的年份也一样(见第 B.5 节)。

表 8.9. 日期/时间类型

名字 存储尺寸 描述 最小值 最大值 解析度
timestamp [ (p) ] [ without time zone ] 8字节 包括日期和时间(无时区) 4713 BC 294276 AD 1微秒
timestamp [ (p) ] with time zone 8字节 包括日期和时间,有时区 4713 BC 294276 AD 1微秒
date 4字节 日期(没有一天中的时间) 4713 BC 5874897 AD 1日
time [ (p) ] [ without time zone ] 8字节 一天中的时间(无日期) 00:00:00 24:00:00 1微秒
time [ (p) ] with time zone 12字节 仅仅是一天中的时间(没有日期),带有时区 00:00:00+1459 24:00:00-1459 1微秒
interval [ fields ] [ (p) ] 16字节 时间间隔 -178000000年 178000000年 1微秒

 

注意

SQL要求只写timestamp等效于timestamp without time zone,并且PostgreSQL鼓励这种行为

timestamptz被接受为timestamp with time zone的一种简写,这是一种PostgreSQL的扩展。

timetimestampinterval接受一个可选的精度值 p,这个精度值声明在秒域中小数点之后保留的位数。缺省情况下,在精度上没有明确的边界。p允许的范围是从 0 到 6。

8.6. 布尔类型

PostgreSQL提供标准的SQL类型boolean,参见表 8.19boolean可以有多个状态:true(真)”、false(假)”和第三种状态unknown(未知)”,未知状态由SQL空值表示。

表 8.19. 布尔数据类型

名字 存储字节 描述
boolean 1字节 状态为真或假

 

真”状态的有效文字值是:

TRUE
't'
'true'
'y'
'yes'
'on'
'1'

而对于假”状态,你可以使用下面这些值:

FALSE
'f'
'false'
'n'
'no'
'off'
'0'

前导或者末尾的空白将被忽略,并且大小写也无关紧要。使用TRUEFALSE这样的关键词比较好(SQL兼容)。

例 8.2显示了使用字母tf输出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]

更多

相关文章

文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,...
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb...
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才...
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation...
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgr...
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解...