跳转至

数据类型

PostgreSQL 提供了丰富的数据类型,包括 **数字类型、货币类型、字符类型、二进制数据类型、时间/日期类型、布尔类型、枚举类型、JSON 类型、几何类型、网络地址类型、bite类型、文本搜索类型、UUID 类型、XML 类型、数组类型、集合类型、区间类型、位字符串类型**等等。

除此之外,PostgreSQL 还提供给我们DIY的乐趣,可以自定义自己想要的数据类型。

数字类型

名字 存储尺寸 描述 范围
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

与MySQL 整数不同,PostgreSQL 不提供无符号整数类型

numeric列的最大精度和最大小数位数都是可以配置的。声明一个类型为numeric的列:

-- (精度)是整个数中有效位的总数,也就是小数点两边的位数。精度必须为正整数,
-- (小数位数)是小数部分的数字位数,也就是小数点右边的部分。小数位数可以为零或者正数

-- 数字 23.5141 的精度为6,而小数位数为4

NUMERIC(precision, scale)

CREATE TABLE tbl_test (
    a integer CHECK(a>0) ,   --如果需要正整数,则使用check约束
    b integer 
)
CREATE TABLE cities (
    city_id serial PRIMARY KEY,
    city_name VARCHAR (255) NOT NULL,
    population INT NOT NULL CHECK (population >= 0)     -- 正整数用check约束来实现
);

字符类型

SQL定义了两种基本的字符类型: character varying(n)character(n), 其中*n是一个正整数。两种类型都可以存储最多n*个字符长的串。

varchar(n)char(n)的概念分别是character varying(n)character(n)的别名,分别表示**变长字符串**和和**定长字符串**

名字 存储尺寸 说明 描述
character varying(n), varchar(n) 4 字节 + 实际字符串占用空间 其中,n 表示该列能够存储的最大字符数。取值范围(0,10,485,760) 变长字符串
character(n), char(n) 4 字节 + 实际字符串占用空间 其中,n表示定长字符串数量,如果实际值小于它,尾部以空格填充 定长,空格填充
text 无限变长

OID类型

对象标识符(OID)被PostgreSQL用来在内部作为多个系统表的主键。 类型oid表示一个对象标识符。

在pg中,oid用来在整个数据集簇中唯一标识一个数据库对象,对象可以是数据库、表、索引、视图、元祖等等。

oid用4个字节的无符号整数表示。因此,在大型数据库中它并不足以提供数据库范围内的唯一性,甚至在一些大型的表中也无法提供表范围内的唯一性。

类型转换

在 postgresql 中,"::" 符号其实是一个强制类型转换符,作用等同于CAST。

在很多情况下,我们需要将一种数据类型的值转换为另一种数据类型。那么我们就可以使用它来进行转换。语法如下:

expression::type

CAST ( expression AS target_type );

强制类型转换需要注意的是,如果表达式不能转换为目标类型,则会触发错误

SELECT oid :: regclass AS table_name FROM pg_class WHERE relkind = 'r';

插入限制

多条insert数据,建议修改为insert values形式。

批量插入的时候values里面的参数个数不能超过32767,可以设置300-500个提交一次。

从源代码中可以看到pgsql使用2个字节的integer,故其取值范围为[-32768, 32767]。

这意味着sql语句的参数数量,即行数*列数之积必须小于等于32767。如果一次插入的数据量太多,使得参数数量超过了最大值,只能分批插入了。

假如表有10列,那么一次最多插入3276行。

https://blog.csdn.net/ziranqiuzhi/article/details/104331348

数组类型

postgresql支持数组类型,可以是基本类型,也可以是用户自定义的类型。日常中使用数组类型的机会不多,但还是可以了解一下。

不像C或JAVA高级语言的数组下标从0开始,postgresql数组下标从1开始,既可以指定长度,也可以不指定长度。

且postgresql既支持一维数组,也支持多维数组,但是平时二维数组也就够用了。

CREATE table tbl_array(
    a int[],                --int[]表示数组长度无限制,int[4]表示数组长度为4.
    b varchar(32)[][],      -- 
    c int
);