json与jsonb常见的差异
关键字:
json、jsonb、人大金仓、KingbaseES、
1. json的概念
json是一种轻量级的数据交换格式,它以人类可读的方式存储和表示数据。他由键值对组成,可以包含多层嵌套的结构。这种数据也可以被存储为 text,但是 JSON 数据类型的优势在于能强制要求每个被存储的值符合JSON规则。也有很多 JSON相关的函数和操作符可以用于存储在这些数据类型中的数据
KES中同时支持json和jsonb这两种格式的使用。
2. json与jsonb在概念上的区别
这两个格式中常见的一些区别就是,json是被保存为文本格式的,而jsonb则是保存为二进制格式的。
因此这一特性通常会使jsonb比json格式占用更多的磁盘空间;且jsonb比json的写入更耗时间,并且json的操作比jsonb的操作,非常明显的会更耗时间,因为在操作一个json格式的数据的时候,每次读取都需要对json数据进行一次解析,转化为二进制数据,而jsonb由于在存储的时候就是存储的二进制数据,因此,在使用的时候,就可以省去解析这一步。
因此,如果只需要进行一些常见的保存于获取json数据,那么使用json格式就完全可以。但是如果需要使用较多的json值的操作,或者需要在一些json字段上使用索引的时候,就需要使用jsonb格式。
3、json与jsonb在实际使用中包含的差异
区别一:jsonb输出的键值的顺序与输入时的不一样
注:这里jsonb的输出顺序需要注意,会出现不同的情况
1、插入key值都为英文的时候,如果英文长度不一样,则长度短的会被输出到前面
select '{"pieapple":7.77,"apple": 7.77}'::jsonb;
select '{"pieapple":7.77,"wwwwwwapple": 7.77}'::jsonb;
2、当插入的key值都是英文的时候,如果英文长度一样,则按照字母顺序排序,排序靠前的会被输出到前面,例如abc与abd,abc会到前面
select '{"apple":7.77,"appla": 7.77}'::jsonb;
select '{"apple":7.77,"applz": 7.77}'::jsonb;
3、当插入的key值有中文和英文的时候,此时一个中文会占用三个英文字母的位置,越少的越靠前,相等情况下英文字母排在前面。
select '{"appappl":7.77,"一二": 7.77}'::jsonb;
select '{"appapp":7.77,"一二": 7.77}'::jsonb;
区别二:当前面的key值相等的时候,就会产生相等的两个键值对覆盖成一个的情况
select '{"apple":"sdafasd","apple":[1, 2]}'::jsonb;
select '{"apple":[1,2],"apple":"asdfas"}'::jsonb;
区别三:jsonb会去掉输入数据中键值的空格
select '{"apple": "sdafasd","apple": 213}'::jsonb;
json则不会删除空格
区别4:在 JSONB 中数据会被按照底层 numeric 类型的行为来打印,那么e记号输入的数字被打印出来就不会有该记号。
select '{"reading": 1.230e-5}'::jsonb;
转换为json则会正常打印
参考资料
《KingbaseES SQL语言参考手册》