一、JSON和JSONB
Postgresql相比较与其它关系型数据库,很大的一个优势在于它内置了很多中特殊的数据类型,像inet、MAC,本文所介绍的json和jsonb类型也是Postgresql特有的2种数据类型,其实他们的本质都是存储jon格式的数据,但是不同的是json格式是按照原样的json字符串进行存储,包括字符串中的重复键、空格、顺序也都会原样保存;而jsonb格式会对原样的json字符串进行解析,会删除重复的键以及空格,而且也不会保证键的顺序,在存储时会转换成二进制。因此,json数据存储时较快,但是读取时稍慢;而jsonb数据存储时稍慢,但是读取时较快。
除此之外,json和jsonb还有一些其它方面的区别:
(1)两者所用的操作和操作符大部分相同,但是jsonb会有一些特定的操作符,如“=”用来判断两个jsonb对象是否相等,“@>”用来判断左边的操作数是否包含右边的操作数。
(2) 我们可以在jsonb类型的字段上直接创建索引,但是在json类型的字段上只能创建函数索引,无法创建直接索引。
下面,笔者就上述这些内容进行验证。首先,先看下笔者用到的两个数据表:
stock_analysis_data=# \d+ custmer
Table "public.custmer"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+-----------------------+-----------+----------+-------------------------------------+----------+--------------+-------------
id | integer | | not null | nextval('custmer_id_seq'::regclass) | plain | |
name | character varying(40) | | | | extended | |
tag | json
- custmer表 —— 具有一个json类型的字段tag
stock_analysis_data=# \d+ account
Table "public.account"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+-----------------------+-----------+----------+-------------------------------------+----------+--------------+-------------
id | integer | | not null | nextval('account_id_seq'::regclass) | plain | |
name | character varying(40) | | | | extended | |
tag | jsonb | | | | extended | |
- account表——具有一个jsonb类型的字段tag
二、插入JSON数据
-
插入json标准格式数据
我们先向custmer表中插入一条标准json格式的数据,以验证json类型数据的插入效果。
stock_analysis_data=# insert into custmer (name,tag) values ('tom','{"age":17,"job":"开发"}');
INSERT 0 1
接下来,我们查看整个custmer表里面的数据:
stock_analysis_data=# select * from custmer;
id | name | tag
----+------+-------------------------
1 | tom | {"age":17,"job":"开发"}
(1 row)
然后,向account插入一条数据。
stock_analysis_data=# insert into account (name,tag) values ('tom','{"age":17,"job":"开发"}'); INSERT 0 1
查看插入后的数据:
stock_analysis_data=# insert into account (name,tag) values ('tom','{"age":17,"job":"开发"}');
INSERT 0 1
我们发现,从account表里面查询出来的数据,tag字段也是一个标准的json格式,实际上json和jsonb两者的主要差异在于存储的数据结构,jsonb是以二进制方式存储的。但是,对于我们使用客户端进行查询来说,查询出来的jsonb格式的数据也会最终以json标准格式呈现出来,他们的存储结构的异同,对我们是无感的。
-
插入时重复键、空格、和顺序处理
&n

本文详细探讨了PostgreSQL数据库中JSON和JSONB两种数据类型的差异,包括存储方式、数据处理(如重复键、空格、顺序)、查询性能及错误处理。通过实例展示了JSONB在存储效率和查询速度上的优势,同时解释了如何在JSONB字段上创建索引以提升查询性能。此外,还介绍了常用的JSON/JSONB操作符和函数,以及如何对JSON/JSONB数据进行修改和删除。

4000

被折叠的 条评论
为什么被折叠?



