postgres数据类型简介
数据类型
0. 数据类型的分类
分类名称
|
说明
|
与其他数据库对比
|
布尔类型
|
支持SQL标准boolean类型
|
与MYSQL中的bool,boolean类型一样,占用1字节空间
|
数值类型
|
整数类型有2字节的smallint,2字节int 8字节bigint ;精确数字类型numeric;非精确类型的浮点小数real和double precision 还有8字节的money(货币类型)
|
无MYSQL中的unsigned类型,也无mysql中的1字节长tinint和3字节长的mediumint整数类型
|
字符类型
|
有varchar(n),char(n),text三种类型
|
pg中最大可存储1G mysql中字符最大可存储64KB,PG中的text类型相当于MYSQL中的longtext类型
|
二进制数据类型
|
bytea类型
|
对应的MYSQL中的blob和longblob类型
|
位串类型
|
由 0 和 1组成的字符串,有bit(n),bit varying(n)两种类型
|
PG最大可支持8388080个bit位
|
日期和时间类型
|
date ,time, timestamp
|
PG可精确到秒以下,MYSQL可精确到毫秒
|
枚举类型
|
enum
|
PGSQL枚举需要预先使用create type来创建该类型
|
几何类型
|
包括点(point),直线(line),线段(lseg),路径(path),多边形(polygon),圆(cycle)
|
PG特有的类型
|
网络地址类型
|
有cidr,inet,macaddr 类型
|
PG特有
|
数组类型
|
可以存储一个数组
|
PG特有类型
|
复合类型
|
可以把已有的类型组合成用户自定义类型
|
对应其他数据库的自定义类型
|
xml
|
XML相关数据存储
|
|
JSON/JSONB类型
|
JSON类型
|
MYSQL在8.0后可支持
|
range类型
|
范围类型,可存储范围数据
|
无
|
对象标识符类型
|
PG内部标识对象类型,如oid类型,regproc类型,regclass类型
|
|
伪类型
|
不能作为字段的数据类型,但他可用于声明函数的参数或者结果的类型
|
|
UUID类型
|
|
|
其他类型
|
|
|
|
|
|
1. 数值类型
类型名称
|
存储长度
|
描述
|
范围
|
smallint
|
2字节
|
小范围整数类型
|
-3276832767(-2^152^15-1)
|
integer
|
4字节
|
整数类型
|
-21474836482147493647(-2^312^31-1)
|
bigint
|
8字节
|
大范围整数类型
|
(-263~263-1)
|
decimal
|
可变
|
用户指定精度
|
无限制
|
numeric
|
可变
|
用户指定精度
|
无限制
|
real
|
4字节
|
变长,不精确
|
6位十进制精度
|
double precision
|
8字节
|
变长,不精确
|
15位十进制精度
|
smallserial
|
2字节
|
smallint自增序列
|
1~32767
|
serial
|
4字节
|
integer自增序列
|
1~2147483647 (1-2^31-1)
|
bigserial
|
8字节
|
bigInteger自增序列
|
1~922372036854775807(1-2^64-1)
|
|
|
|
|
注意:
-
decimal和numeric是等效的
-
real和double precison 浮点类型
-
smallSerial和serial 和bingSerial指的是自增类型,但是其实是在创建后再后面默认添加了一个函数
-
浮点类型中还有几个特殊值
2. 字符类型
字符类型名称
|
描述
|
varchar(n)
|
变长类型,字符最大有限制 ,最大1G 存储空间为:4+实际字符长度。
|
char(n)
|
定长字段,没达到最大用空白填充 最大1G ,存储空间为4+n
|
text
|
文本类型,变长,无限制
|
注意:
-
如果character varying(n)如果不声明长度,则和text一样,可以没有限制长度
-
pgsql最大支持长度为1GB
2.1 字符串函数
-
计算字符数:char_length(xxx);
-
计算占用字节数:octet_length(xxx);
-
位置:postition(a in b)
-
子串:substring(str from 1 for 4)
-
拆分字符串:split_part(String text,delimiter text,filed int)
3. 时间类型
字符类型名称
|
存储长度
|
描述
|
timestamp
|
8字节
|
包括日期和时间,不带时区。简写成timestamp
|
Timestamp with time zone
|
8字节
|
包括时间和日期,带时区,简写timestamptz
|
date
|
4字节
|
日期,但不包含一天中的时间
|
time
|
8字节
|
一天中的时间,不包含日期,不带时区
|
time with time zone
|
12字节
|
一天中的时间,不包含日期,带时区
|
interval
|
16字节
|
时间间隔
|
3.1 时间类型函数
日期相加
select date '2017-07-29'+ interval'1 days'
日期相减
select date '2017-07-29'- interval'1 days'
常用函数
-
显示当前时间:select current_date,current_time;
-
抽取年月日: select extract(field from source)
时间函数
-
CURREN_DATE
-
CURRENT_TIME
-
CURRENT_TIMESTAMP
-
CURRENT_TIME(precision)
-
now()
4. 布尔类型(bool)
1 字节,状态为true或false
5. 网络地址类型
字符类型名称
|
存储长度
|
描述
|
cidr
|
7或者19字节
|
IPV4或者IPV6
|
inet
|
7或者19字节
|
IPV4或者IPV6
|
macaddr
|
6字节
|
MAC地址
|
macaddr8
|
8字节
|
MAC地址(EUI-64格式)
|
6. 数组类型
在创建的时候添加[]就可以变成数组类型
CREATE table text_arr1(
id integer,
arr_i integer[],
arr_t text[]
)
插入
insert into text_arr1 values(1,'{1,2,3}','["dadsa","dsada"]')
insert into text_arr1 values(1,array[1,2,3],array["dadsa","dsada"])
数组追加:array_append(anyArr,anyElem)
数组remove: array_remove(anyArr,anyElem);
获取数组维度:array_ndims(数组)
获取数组的位置:array_postition(arr,findElem)
替换:array_replace(arr,sourceElem,target)
TOString:array_to_string(arr,sourceElem,target)
7. 范围类型
-
int4range:integer范围类型
-
int8range:bigint范围类型
-
numrange:numeric 范围类型
-
tsrange :不带时区的timestamp范围类型
-
tstzrange:带时区的timstamp范围类型
-
date:date范围类型
8. json/jsonb类型
这两种类型使用上完全一致,JSON是把输入的数据原封不动的存储到数据中,但是jsonb类型是在存储的时候就把JSON解析成为了二进制类型,JSONB类型会比JSON类型效率高
8.0 JSON支持的类型
JSON的类型
|
PG上的类型
|
注意事项
|
string
|
text
|
字符集只支持UTF-8
|
number
|
numeric
|
JSON中没有PG中的NaN和infinity的值
|
boolean
|
boolean
|
JSON中只能接受小写的true或者false
|
null
|
none
|
SQL中的NULL代表不同的意思
|
|
|
|
8.1 json类型
创建表
create table table_name(id serial primary key,name json);
插入数据
insert into table_name(name) value ('{"col1":"dd","col2":"col2value"}')
查询
select * from table_name -- 全部
select name->'col2' from table_name --单字段,显示键值
select name ->>'col2' from table_name -- 单独字段,以文本格式
8.2 jsonb类型:其实就是以二进制存储,并且会去除一些不必要的空格和删除重复键
-- 将josn对象转换成键值对象
select * from json_each('{"col1":"dd","col2":"col2value"}')
--以文本形式返回
select * from json_each_text('{"col1":"dd","col2":"col2value"}')
-- 将行转换成json
select row_to_json(test_copy) from test_copy where id=1
9. 数据类型转换
函数
|
返回类型
|
描述
|
实例
|
to_char(timestamp,text)
|
text
|
把时间戳转换成字符串
|
to_char(current_timestamp,"HH12:MI:SS")
|
to_char(interval,text)
|
text
|
把间隔转换成字符串
|
to_char(interval '15h 2m 12s',"HH12:MI:SS")
|
To_char(int,text)
|
text
|
把整数类型转换成字符串
|
|
to_char(numeric,text)
|
text
|
把数字转换成字符串
|
|
to_date(text,text)
|
date
|
把字符转换成日期
|
|
to_number(text,text)
|
numeric
|
把字符转换成数字
|
|
to_timestamp(text,text)
|
Timestamp with time zone
|
把字符串转换成时间戳
|
|
-
用case 转换
select cast(varchar'123' as text);
select cast(varchar'123' as int4);
-
通过::进行转换
select 1::int4,3/2::numeric;
python3 网页截图整页 python网页长截图
网上查到有个第3方接口(网页截屏大师)可以实现截取网页长图,只能针对部分网站调用首先,先在https://www.screenshotmaster.com/ 注册一个账号,在用户中心获取到一个唯一的Token,并保存然后使用Python脚本调用截屏大师的接口获取截图,代码示例:import urllib.parse
import urllib.request
import ssl
ssl._cr