PostgreSQL 数据类型
PostgreSQL 数据类型
lingyun数字类型
- 整数
- 用户指定精度类型
- 浮点类型
- serial类型(自增整数)
名字 | 存储长度 | 描述 | 范围 |
---|---|---|---|
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 |
字符类型
名称 | 描述 |
---|---|
character varying(n), varchar(n) | 变长,有长度限制 |
character(n), char(n) | n定长,不足补空白 |
text | 变长,无长度限制 |
PostGreSQL支持最大的字段大小为1GB,所以text的无限制并非真的无限制。
相关函数
char_length('abcd')
求字符数octet_length('abcd')
求字符占用字节数position('a' in 'abcd')
字符在字符串的位置substring('francs' from 3 for t)
字符串切片split_part(string text, delimiter text, field int)
切割字符串
时间/日期类型
名称 | 描述 |
---|---|
timestamp | 日期和时间 |
date | 日期 |
time | 只用于一日内的时间 |
interval | 时间间隔 |
相关函数
select now()
显示当前日期和时间
select current_date, current_time;
显示当前日期和时间
select extract(year from now());
从时间中抽出{year}
布尔类型
名称 | 描述 |
---|---|
boolean | true/false |
true的有效值可以是TRUE
, t
, true
, y
, yes
, on
, 1
false的有效值是FALSE
, f
, false
, n
, no
, off
, 0
网络地址类型
名称 | 存储空间 | 描述 |
---|---|---|
cidr | 7或19字节 | IPv4或IPv6网络 |
inet | 7或19字节 | IPv4或IPv6主机和网络 |
macaddr | 6字节 | MAC地址 |
可以使用转换来检查类型是否合法:select '192.168.2.1000'::inet;
数组类型
数字的定义是在字段数据类型后面加上[]
。
比如:
1 | CREATE TABLE test_array1 ( |
数组类型的插入有两种方式。
第一种使用花括号:
1 | INSERT INTO test_array1(id, array_i, array_t) |
第二种使用ARRAY
关键字:
1 | INSERT INTO test_array1(id, array_i, array_t) |
数组的操作
查询
正常进行查询即可,返回整个数组
1 | SELECT array_i FROM test_array1 WHERE id=1; |
也可以使用下标:
1 | SELECT array_i[1] FROM test_array1 WHERE id=1; |
追加
语法:array_append(anyarray, anyelement)
例子:
1 | SELECT array_append(array[1,2,3], 4); |
也可以使用||
操作符:
1 |
|
删除
语法:array_remove(anyarray, anyelement)
例子:
1 | SELECT array_remove(array[1,2,2,3], 2); |
修改
1 | UPDATE test_array1 SET array_i[3]=4 WHERE id=1; |
数组操作符
相关函数
SELECT array_ndims(array[[1,2],[3,4]]);
获取数组维度
SELECT array_length(array[1,2],1);
获取数组从长度
SELECT array_position(array['a','b','c','d'], 'd')
返回元素在数组的位置
SELECT array_replace(array[1,2,5,4], 5, 10);
替换元素
SELECT array_to_string(array[1,2,3,4], ',', 'None');
元组转字符串显示,第二个参数为分隔符,第三个参数为值为NULL的显示默认值
范围类型
名称 | 描述 |
---|---|
int4range | integer的范围 |
int8range | bigint的范围 |
numrange | numeric的范围 |
tsrange | timestamp without time zone的范围 |
tstzrange | timestamp with time zone的范围 |
daterange | date的范围 |
用户可以自定义范围数据类型:
1 | SELECT int4range(1, 5); |
每个类型都包含上界,和下界。[
代表包含下界,(
代表排除下界。
声明范围类型时,定义上,下界的方式:
1 | SELECT int4range(1, 5, '(]'); |
Json/Jsonb类型
1 | SELECT '{"a":1, "b":2}'::json; |
为了方便说明例子,创建一个带有json类型的表:
1 | CREATE TABLE test_json1(id serial primary key,name json); |
插入元素
1 | INSERT INTO test_json1(name) VALUES |
查询数据
1 | # id为1,字段name的json下键为col2的值 |
以文本格式返回json字段键值:
1 | SELECT name ->> 'col2' FROM test_json1 WHERE id=1; |
json和jsonb差异
json存储格式为文本,而jsonb存储格式为二进制。
- json写入快,jsonb检索快
- jsonb输出的键的顺序和输入不一样
- jsonb会去掉输入数据中键值的空格
- jsonb会删除重复的键,仅保留最后一个
大多数应用场景下建议使用jsonb。
操作符
SELECT '{"a": 1, "b": 2}'::jsonb ? 'a';
键是否在json中
SELECT '{"a": 1, "b": 2}'::jsonb - 'a';
删除键值
相关函数
SELECT * FROM json_each('{"a": 1, "b": 2}');
以键值对输出
SELECT * FROM json_each_text('{"a": 1, "b": 2}');
以文本形式返回
SELECT row_to_json(test_copy) FROM test_copy WHERE id=1;
将一行数据通过json格式返回(实用)
SELECT * FROM json_object_keys('{"a": 1, "b": 2}');
返回键集合
jsonb键值操作
追加
1 | SELECT '{"name": "framcs", "age": "31"}'::jsonb || |
删除
1 | SELECT '{"name": "framcs", "age": "31"}': - 'age'; |
更新
1 | SELECT '{"name": "framcs", "age": "31"}'::jsonb || |