数据类型¶
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
);