PostgreSQL入门之数据类型(1)

目录

 

说明

1、数值类型

1.1整数类型

1.2任意精度数值

1.3浮点数类型

1.4 Serial(序号)类型

2、字符类型

3、日期/时间类型

3.1日期 

3.2 时间

3.3 时间戳

4、布尔类型

5、货币类型

5、几何类型

6、枚举类型


说明

打算通过两篇章来介绍PostgreSQL的数据类型:

第一篇章主要介绍数值类型、字符类型、日期/时间类型、布尔类型、货币类型、几何类型及枚举类型。

第二篇主要介绍json类型、网络地址类型、位串类型、XML类型、数组类型、复合类型等。

数据类型是我们在创建表的时候为字段设定的类型。

PostgreSQL提供了丰富的数据类型,不仅内置了许多常用的数据类型(比如数值、字符等类型),还考虑到企业级特性增加了特殊的数据类型,并且还可以使用CREATE TYPE命令在数据库中创建新的数据类型。

下面来具体介绍。

1、数值类型

数值类型有2字节、4字节或8字节以及4字节或8字节的浮点数和可选精度的十进制数组成。如下表:

名字

存储长度

描述

范围

smallint

2 字节

小范围整数

-32768 到 +32767

integer

4 字节

常用的整数

-2147483648 到 +2147483647

bigint

8 字节

大范围整数

-9223372036854775808 到 +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

 

1.1整数类型

类型smallint、integer和bigint存储各种范围的全部是数字的数,也就是没有小数部分的数字。试图存储超出范围以外的数值将导致一个错误。常用的类型是integer,因为它提供了在范围、存储空间和性能之间的最佳平衡。一般只有在磁盘空间紧张的时候才使用smallint。而只有在integer的范围不够的时候才使用bigint,因为前者(integer)绝对快得多。 

1.2任意精度数值

类型numeric可以存储最多1000位精度的数字并且准确地进行计算。因此非常适合用于货币金额和其它要求计算准确的数量。不过,numeric类型上的算术运算比整数类型或者浮点数类型要慢很多。
   numeric字段的最大精度和最大比例都是可以配置的。要声明一个类型为numeric的字段,你可以用下面的语法:
   NUMERIC(precision,scale)    (精度,刻度)
   比如数字23.5141的精度为6,而刻度为4。
   在目前的PostgreSQL版本中,decimalnumeric是等效的。

1.3浮点数类型

数据类型real和double是不准确的、牺牲精度的数字类型。不准确意味着一些数值不能准确地转换成内部格式并且是以近似的形式存储的,因此存储后再把数据打印出来可能显示一些缺失。

1.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类型创建的序列在其所属字段被删除时,该序列也将被自动删除,但是其它情况下是不会被删除的。因此,如果你想用同一个序列发生器同时给几个字段提供数据,那么就应该以独立对象的方式创建该序列发生器。

2、字符类型

名字

存储长度

描述

character varing(n)、varchar(n)

可变长

有长度限制

character(n)

char(n)

定长

不足补空白

text

可变长

无长度限制

定义了两种基本的字符类型,varchar(n)和char(n),这里的n是一个正整数。两种类型都可以存储最多n个字符长的字串,试图存储更长的字串到这些类型的字段里会产生一个错误,除非超出长度的字符都是空白,这种情况下该字串将被截断为最大长度。如果没有长度声明,char等于char(1),而varchar则可以接受任何长度的字串。

这三种类型之间没有性能差别,只不过是在使用char类型时增加了存储尺寸。虽然在某些其它的数据库系统里,char(n)有一定的性能优势,但在PostgreSQL里没有。在大多数情况下,应该使用text或者varchar。

3、日期/时间类型

名字

存储空间

描述

最低值

最高值

分辨率

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 位

任何日期或者时间的文本输入均需要由单引号包围,就象一个文本字符串一样。

3.1日期 

以下为合法的日期格式列表

例子

描述

January 8, 1999

在任何datestyle输入模式下都无歧义

1999-01-08

ISO-8601格式,任何方式下都是199918号,(建议格式)

1/8/1999

歧义,在MDY下是18号;在 DMY模式下读做81

1/18/1999

MDY模式下读做118日,其它模式下被拒绝

01/02/03

MDY模式下的200312日;DMY模式下的200321日;YMD 模式下的200123

1999-Jan-08

任何模式下都是18

Jan-08-1999

任何模式下都是18

08-Jan-1999

任何模式下都是18

99-Jan-08

YMD模式下是18日,否则错误

08-Jan-99

18日,除了在YMD模式下是错误的之外

Jan-08-99

18日,除了在YMD模式下是错误的之外

19990108

ISO-8601; 任何模式下都是199918

990108

ISO-8601; 任何模式下都是199918

 

 

3.2 时间

以下为合法的时间格式列表

例子

描述

04:05:06.789

ISO 8601

04:05:06

ISO 8601

04:05

ISO 8601

040506

ISO 8601

04:05 AM

04:05一样;AM不影响数值

04:05 PM

16:05一样;输入小时数必须 <= 12

04:05:06.789-8

ISO 8601

04:05:06-08:00

ISO 8601

04:05-08:00

ISO 8601

040506-08

ISO 8601

 

 

 

 

 

3.3 时间戳

时间戳类型的有效输入由一个日期和时间的联接组成,后面跟着一个可选的时区。因此,1999-01-08 04:05:06和1999-01-08 04:05:06 -8:00都是有效的数值。

4、布尔类型

PostgreSQL支持标准的boolean数据类型。

boolean有true(真)和false(假)两种状态,第三种unknown(未知)状态用null表示。

名称

存储格式

描述

boolean

1字节

true/falase

 

5、货币类型

money类型存储带固定小数精度的货币金额。

numeric、int和bigint类型的值可以转换为money,不建议使用浮点数来处理货币类型,以为存在舍入错误的可能性。

名称

存储格式

描述

范围

money

8 字节

货币金额

-92233720368547758.08 到 +92233720368547758.07

 

 

 

5、几何类型

几何数据类型表示二维的平面物体。

最基本的类型:点。它是其他类型的基础。

名字

存储空间

说明

表现形式

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> (圆心和半径)

 

 

 

6、枚举类型

枚举类型是一个包含静态和值得有序集合的数据类型。

PostgreSQL中的枚举类型类似于C语言中的enum。

需要使用CREATE TYPE命令创建

如下例子

创建星期枚举类型:

CREATE TYPE week AS enum ('Mon','Tue','Wed',

'Thu','Fri','Sat','Sun');

     创建表列类型为枚举week

     CREATE  TABLE t_week(id serial,create_mood week);

     插入数据:由于字段create_mood数据类型为枚举类

型,则字段的值只能为枚举类型week设定的值。

   INSERT INTO t_week(create_mood) values('Mon');

   如上插入的值为Mon,是枚举中的值,可插入成功。如下,插入的值MMM不是枚举week中的值,则会报错:

   INSERT INTO t_week(create_mood) values('MMM');

ERROR:  22P02: invalid input value for enum week: "MMM"

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Darion@pg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值