数据库系列
1、Linux安装Postgres,你学费了吗?
 2、PostgreSQL的基本类型和 Schema,我又学废了
文章目录
前言
一、PostGreSQL 数据类型
PostgreSQL 数据库提供了及其丰富的数据类型,我们在定义表结构的时候,要指定每个字段的类型,就需要明了每个数据类型的特性,以便我们在指定字段类型的时候能根据业务需要指定合适的类型。
 更全面的了解可移步PG中文官网:http://www.postgres.cn/docs/11/datatype.html
1.1 字符串类型
| 类型 | 描述 | 
|---|---|
| character, varying(n), varchar(n) | 有限制的变长 | 
| character(n), char(n) | 定长,空格填充 | 
| text | 无限变长 | 
1.2 数字类型
| 类型 | 存储长度 | 描述 | 范围 | 
|---|---|---|---|
| smallint | 2字节 | 小范围整数 | -32768 ~ 32767 | 
| integer | 4字节 | 整数范围 | -2147483648 to +2147483647 | 
| bigint | 8字节 | 大范围整数 | -9223372036854775808 to +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 | 
1.3 日期/时间类型
| 类型 | 存储长度 | 描述 | 最小值 | 最大值 | 解析度 | 
|---|---|---|---|---|---|
| timestamp [ without time zone ] | 8字节 | 日期和时间(无时区) | 4713 BC | 294276 AD | 1微妙 | 
| timestamp [ with time zone ] | 8字节 | 日期和时间(有时区) | 4713 BC | 294276 AD | 1微妙 | 
| date | 4字节 | 日期 | 4713 BC | 294276 AD | 1日 | 
| time [ without time zone ] | 8字节 | 一天中的时间(无日期) | 00:00:00 | 24:00:00 | 1微妙 | 
| time [ with time zone ] | 12字节 | 一天中的时间(无日期),有时区 | 00:00:00+1459 | 24:00:00-1459 | 1微妙 | 
| interval | 16字节 | 时间间隔 | -178000000年 | 178000000年 | 1微妙 | 
注意:SQL只要写 timestamp 等效于 timestamp whtiout time zone,并且 PG 也是鼓励这种方式,timestampz 则是 timestamp with time zone 的一种简写,PostgreSQL 的扩展类型。
1.4 JSON 类型
1.4.1 json 和 jsonb
1.4.2 JSON 和 PostgreSQL 类型对应
JSON基本类型和相应的 PostgreSQL 类型:
| JSON基本类型 | PostgreSQL 类型 | 注释 | 
|---|---|---|
| string | text | 不允许\u0000,如果数据库编码不是 UTF8,非 ASCII Unicode 转义也是这样 | 
| number | numeric | 不允许NaN 和 infinity值 | 
| boolean | boolean | 只接受小写true和false拼写 | 
| null | (无) | SQL NULL是一个不同的概念 | 
1.4.3 有效合理的使用 JSON
将数据存储为 JSON 类型比传统的数据模型更加灵活,在需求不固定时,这种优势更加突出优势。不过,即便是一个要求最大灵活性的应用中,还是推荐使用 JSON 文档固定的格式,虽然格式不是固定的,但是有一个可预测的结构会使书写概括一个表中的数据查询更容易。
 JSON 存储在表中时,
1.4.4 jsonb 包含和存在
- 简单的标量/基本值只包含相同的值
 
select '"foo"'::jsonb @> '"foo"'::jsonb;
 
- 右边的数字被包含在左边的数组中
 
select '[1,2,3]'::jsonb @> '[1,2,2]'::jsonb;
 
- 数组元素的顺序没有意义,因此这个例子也返回真
 
select '[1,2,3]'::jsonb @> '[3,1]'::jsonb;
 
- 重复的数组元素也没有关系
 
select '[1,2,3]'::jsonb @> '[1,2,2]'::jsonb;
 
- 右边具有一个单一键值对的对象被包含在左边的对象中
 
select '{"product":"pg", "version":9.4, "jsonb":true}'::jsonb @> '{"version":9.4}'::jsonb;
 
- 右边的数组不会被认为包含在左边的数组中,即使其中嵌入了一个相似的数组
 
select '[1,2,[1,3]]'::jsonb @> '[1,3]'::jsonb;
 
但是如果同样也有嵌套,包含就成立
select '[1,2,[1,3]]'::jsonb @> '[[1,3]]'::jsonb;
 
- 包含一个顶层键和一个空对象
 
select '{"foo":{"bar": "baz"}}'::jsonb @> '{"foo":{}}'::jsonb;
 
- 字符串作为一个对象键存在
 
select '{"foo":"bar"}'::jsonb ? 'foo';
 
- 和包含一样,存在必须在顶层匹配
 
select '{"foo":{"bar":"baz"}}'::jsonb ? 'bar';
 
1.5 货币类型
money 类型存储固定小数精度的货币数字,小数的精度由数据库的lc_monetary设置决定。
| J名字 | 尺寸 | 描述 | 范围 | 
|---|---|---|---|
| money | 8 bytes | 货币额 | -92233720368547758.08到+92233720368547758.07 | 
1.6 其他类型
除了以上数据类型,还包括其他数据类型,包括:二进制数据类型、布尔类型、枚举类型、几何类型、网络地址类型、位串类型、文本搜索类型、UUID类型、XML类型、数组类型、范围类型等。
 后续更新这些类型使用。
二、PostgreSQL 中的 Schema
2.1 Schema 是什么?
一个 PostgreSQL 数据库集群中包含一个或多个数据库,角色和一些其他对象类型被整个集群共享,连接到服务器的客户端只能访问单个数据库中的数据,可以在连接请求中指定那一个。
一个数据库包含一个或者多个命名模式,模式中包含着表。模式还包含其他类型的命名对象,包括 数据类型、函数 和 操作符。相同的对象名称可以被用于不同模式中而不会出现冲突,比如 mySchema 和 phenSchema 都可以创建 tb_user 的表,见下图:
 
 和数据库不同,模式并不是严格地隔离:一个用户可以访问它所连接的数据库中的所有模式内的对象,只要有足够的权限。
2.2 Schema 有什么好处?
使用模式带来的好处如下:
- 允许多个用户使用同一个数据库并且不会互相干扰。
 - 将数据库对象组织成逻辑组以便容易进行管理。
 - 第三方应用的对象可以放在独立的模式中,这样就不会和其他对象的名称发生冲突。.
 
2.3 公共模式
在上图中可以看到在 postgres 数据库模式下有一个名叫 public 的模式,默认情况下不指定模式,这些表(以及其他对象)会自动的被放入 “public” 的模式中。任何新数据库都包含这样一个模式,因此下面命令是等效的:
create table tb_user(...);
create table public.tb_user(...)
 
三 数据类型总结
| 类型 | 别名 | 描述 | 
|---|---|---|
| bigint | int8 | 有符号的 8 字节整数 | 
| bigserial | serial8 | 自动增长的 8 字节整数 | 
| bit varying[ n ] | varbit [ n ] | 变长位串 | 
| boolean | bool | 逻辑布尔值 | 
| bytea | 二进制数据【字节数组】 | |
| character [ n ] | char [ n ] | 定长字符串 | 
| character varying | varchar [ n ] | 变长字符串 | 
| date | 日历日期(年、月、日) | |
| double precision | float 8 | 双精度浮点数(8字节) | 
| integer | int, int4 | 有符号4字节整数 | 
| interval [ fields ] [ § ] | 时间段 | |
| json | 文本JSON数据 | |
| jsonb | 二进制 JSON 数据,已分解 | |
| money | 货币数量 | |
| numeric [ (p, s) ] | decimal [ (p, s) ] | 可选择进度的精确数字 | 
| pg_lsn | PostgreSQL日志序列号 | |
| real | float 4 | 单精度浮点数(4字节) | 
| smallint | int 2 | 有符号2字节整数 | 
| smallserial | serial2 | 自动增长的2字节整数 | 
| serial | serial4 | 自动增长的4字节整数 | 
| text | 变长字符串 | |
| time [ § ] [ without time zone ] | 一天中的时间(无时区) | |
| time [ § ] with time zone | timetz | 一天中的时间,包括时区 | 
| timestamp [ § ] with time zone | 日期和时间,包括时区 | |
| timestamp [ § ] with time zone | timestamptz | 日期和时间,包括时区 | 
| tsquery | 文本搜索查询 | |
| tsvector | 文本搜索文档 | |
| txid_snapshot | 用户级别事务ID快照 | |
| uuid | 通用唯一标识码 | |
| xml | XML数据 | |
| bit [ (n) ] | 定长位串 | |
| box | 平面上的普通方框 | |
| cidr | IPv4或IPv6网络地址 | |
| inet | IPv4或IPv6主机地址 | |
| circle | 平面上的圆 | |
| line | 平面上的无限长的线 | |
| lseg | 平面上的线段 | |
| macaddr | MAC(Media Access Control)地址 | |
| macaddr8 | MAC(Media Access Control)地址(EUI-64格式) | |
| path | 平面上的几何路径 | |
| point | 平面上的几何点 | |
| polygon | 平面上的封闭几何路径 | 










