JSON在MySQL8.x中也做了支持,但是MySQL支持的不好,因为JSON类型做查询时,基本无法给JSON字段做索引。
PGSQL支持JSON类型以及JSONB类型。
JSON和JSONB的使用基本没区别。
撇去JSON类型,本质上JSON格式就是一个字符串,比如MySQL5.7不支持JSON的情况的下,使用text也可以,但是字符串类型无法校验JSON的格式,其次单独的字符串没有办法只获取JSON中某个key对应的value。
JSON和JSONB的区别:
- JSON类型无法构建索引,JSONB类型可以创建索引。
- JSON类型的数据中多余的空格会被存储下来。JSONB会自动取消多余的空格。
- JSON类型甚至可以存储重复的key,以最后一个为准。JSONB不会保留多余的重复key(保留最后一个)。
- JSON会保留存储时key的顺序,JSONB不会保留原有顺序。
JSON中key所对应的value的数据类型
JSON | PGSQL |
String | text |
number | numeric |
boolean | boolean |
null | (none) |
[
{"name": "张三"},
{"name": {
"info": "xxx"
}}
]
操作JSON:
- 上述的四种JSON存储的类型:
select '9'::JSON,'null'::JSON,'"laozheng"'::JSON,'true'::json;
select '9'::JSONB,'null'::JSONB,'"laozheng"'::JSONB,'true'::JSONB;
- JSON数组
select '[9,true,null,"我是字符串"]'::JSON;
- JSON对象
select '{"name": "张三","age": 23,"birthday": "2011-11-11","gender": null}'::json;
select '{"name": "张三","age": 23,"birthday": "2011-11-11","gender": null}'::jsonb;
- 构建表存储JSON
create table test(
id bigserial,
info json,
infob jsonb
);
insert into
test
(info,infob)
values
('{"name": "张三" ,"age": 23,"birthday": "2011-11-11","gender": null}',
'{"name": "张三" ,"age": 23,"birthday": "2011-11-11","gender": null}')
select * from test;
- 构建索引的效果
create index json_index on test(info);
create index jsonb_index on test(infob);
JSON还支持很多函数。可以直接查看 http://www.postgres.cn/docs/12/functions-json.html 函数太多了,不分析了。