Postgresql杂谈 05—Postgresql中的JSON和JSONB类型

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

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值