2024年4月22日发(作者:)

一、数值类型:

下面是PostgreSQL所支持的数值类型的列表和简单说明:

名字

存储空间

描述

范围

smallint

integer

bigint

decimal

numeric

real

double

serial

2 字节

4 字节

8 字节

变长

变长

4 字节

8 字节

4 字节

小范围整数

常用的整数

大范围的整数

用户声明精度,精确

用户声明精度,精确

变精度,不精确

变精度,不精确

自增整数

大范围的自增整数

-32768 到 +32767

-2147483648 到 +2147483647

-9223372 到 9223372

无限制

无限制

6 位十进制数字精度

15 位十进制数字精度

1 到 +2147483647

1 到 9223372

bigserial

8 字节

1. 整数类型:

类型smallint、integer和bigint存储各种范围的全部是数字的数,也

就是没有小数部分的数字。试图存储超出范围以外的数值将导致一个错误。常用

的类型是integer,因为它提供了在范围、存储空间和性能之间的最佳平衡。一

般只有在磁盘空间紧张的时候才使用smallint。而只有在integer的范围不够

的时候才使用bigint,因为前者(integer)绝对快得多。

2. 任意精度数值:

类型numeric可以存储最多1000位精度的数字并且准确地进行计算。因

此非常适合用于货币金额和其它要求计算准确的数量。不过,numeric类型上的

算术运算比整数类型或者浮点数类型要慢很多。

numeric字段的最大精度和最大比例都是可以配置的。要声明一个类型

为numeric的字段,你可以用下面的语法:

NUMERIC(precision,scale)

比如数字23.5141的精度为6,而刻度为4。

在目前的PostgreSQL版本中,decimal和numeric是等效的。

3. 浮点数类型:

数据类型real和double是不准确的、牺牲精度的数字类型。不准确意

味着一些数值不能准确地转换成内部格式并且是以近似的形式存储的,因此存储

后再把数据打印出来可能显示一些缺失。

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类型创建的序列在其所属字段被删除

时,该序列也将被自动删除,但是其它情况下是不会被删除的。因此,如果你想

用同一个序列发生器同时给几个字段提供数据,那么就应该以独立对象的方式创

建该序列发生器。

二、字符类型:

下面是PostgreSQL所支持的字符类型的列表和简单说明:

名字

描述

varchar(n)

char(n)

text

变长,有长度限制

定长,不足补空白

变长,无长度限制

SQL 定义了两种基本的字符类型,varchar(n)和char(n),这里的n是

一个正整数。两种类型都可以存储最多n个字符长的字串,试图存储更长的字串

到这些类型的字段里会产生一个错误,除非超出长度的字符都是空白,这种情况

下该字串将被截断为最大长度。如果没有长度声明,char等于char(1),而

varchar则可以接受任何长度的字串。

MyTest=> CREATE TABLE testtable(first_col varchar(2));

CREATE TABLE

MyTest=> INSERT INTO testtable VALUES('333');

--插入字符串

的长度,超过其字段定义的长度,因此报错。

ERROR: value too long for type character varying(2)

--插入字符串中,超出字段定义长度的部分是空格,因此可以插入,但

是空白符被截断。

MyTest=> INSERT INTO testtable VALUES('33 ');

INSERT 0 1

MyTest=> SELECT * FROM testtable;

first_col

-----------

33