jsonb
分解后的二进制 JSON 数据
当前查看 PostgreSQL 18。
中文定义与说明
分解后的二进制 JSON 数据
同版本中文手册节选
JSON 数据类型用于存储 JSON(JavaScript Object Notation)数据,如
RFC
7159 所定义。这类数据也可以存储为 text,但 JSON
数据类型的优势在于会强制每个存储值都符合 JSON 规则。此外,对于存储在这些数据类型中的数据,还提供了各种 JSON 专用的函数和操作符;见第 9.16 节。
PostgreSQL 提供两种用于存储 JSON 数据的类型:json 和 jsonb。为了为这些数据类型实现高效的查询机制,PostgreSQL 还提供了
jsonpath 数据类型,其说明见第 8.14.7 节。
json 和 jsonb 数据类型接收的输入值集合几乎完全相同。主要的实际区别在于效率。json 数据类型存储输入文本的精确副本,因此处理函数在每次执行时都必须重新解析;而 jsonb 数据则以分解后的二进制格式存储,由于增加了转换开销,输入时会稍慢一些,但处理起来会显著更快,因为不需要重新解析。jsonb 还支持索引,这可能是一个显著优势。
由于 json 类型存储的是输入文本的精确副本,因此它会保留词元之间在语义上无关紧要的空白,以及 JSON 对象内部键的顺序。此外,如果值中的某个 JSON 对象包含同一个键多次,所有键/值对都会被保留下来(处理函数会将最后一个值视为生效值)。相比之下,jsonb 不保留空白,不保留对象键的顺序,也不保留重复的对象键。如果输入中指定了重复的键,则只保留最后一个值。
PG10–20 核心源码清单。类型转换与操作符类列出源码显式声明的关系;缺少记录不能排除通过其他机制进行转换或使用索引。
定义
分解后的二进制 JSON 数据
jsonb
- 目录名称
- pg_catalog.jsonb
- 类型 OID
- 3802
- 类型种类
- 基础类型
- 声明长度
- 变长(varlena)
- 存储策略
- 扩展
- 输入函数
- jsonb_in
- 输出函数
- jsonb_out
系统目录属性
此构建的源码初始化值。字段含义参见 pg_type 。包含头文件默认值;依赖构建的常量保留符号形式,不作为服务器运行时实测。
oid3802descrBinary JSONtypacl_null_typlen-1typelem0typnamejsonbtypsendjsonb_sendtyptypebtypalignityparray0typbyvalftypdelim','typinputjsonb_intypmodin-typndims0typownerPOSTGREStyprelid0typmodout-typoutputjsonb_outtyptypmod-1typanalyze-typdefault_null_typnotnullftypreceivejsonb_recvtypstoragextypbasetype0typcategoryUtypcollation0typisdefinedttypnamespacepg_catalogtypsubscriptjsonb_subscript_handlertypdefaultbin_null_array_type_oid3807typispreferredfarray_type_name_jsonb
类型转换 9
与此类型相关的显式 pg_cast 记录。PostgreSQL 还支持 pg_cast 之外的类型转换,缺少记录不能证明转换不可能。
运算符重载 24
每种操作数签名均为独立重载。实现函数和返回类型来自同一源码构建。
| 运算符 | 左操作数 | 右操作数 | 返回类型 | 含义 | 实现函数 |
|---|---|---|---|---|---|
-> | jsonb | text | jsonb | 获取 jsonb 对象字段。 | jsonb_object_field |
->> | jsonb | text | text | 获取 jsonb 对象字段并返回文本。 | jsonb_object_field_text |
-> | jsonb | int4 | jsonb | 获取 jsonb 数组元素。 | jsonb_array_element |
->> | jsonb | int4 | text | 获取 jsonb 数组元素并返回文本。 | jsonb_array_element_text |
#> | jsonb | _text | jsonb | 按路径元素获取 jsonb 值。 | jsonb_extract_path |
#>> | jsonb | _text | text | 按路径元素获取 jsonb 值并返回文本。 | jsonb_extract_path_text |
= | jsonb | jsonb | bool | 等于。 | jsonb_eq |
<> | jsonb | jsonb | bool | 不等于。 | jsonb_ne |
< | jsonb | jsonb | bool | 小于。 | jsonb_lt |
> | jsonb | jsonb | bool | 大于。 | jsonb_gt |
<= | jsonb | jsonb | bool | 小于或等于。 | jsonb_le |
>= | jsonb | jsonb | bool | 大于或等于。 | jsonb_ge |
@> | jsonb | jsonb | bool | 包含。 | jsonb_contains |
? | jsonb | text | bool | 键存在。 | jsonb_exists |
?| | jsonb | _text | bool | 任意键存在。 | jsonb_exists_any |
?& | jsonb | _text | bool | 所有键均存在。 | jsonb_exists_all |
<@ | jsonb | jsonb | bool | 被包含。 | jsonb_contained |
|| | jsonb | jsonb | jsonb | 连接。 | jsonb_concat |
- | jsonb | text | jsonb | 删除对象字段。 | jsonb_delete(jsonb,text) |
- | jsonb | _text | jsonb | 删除对象字段。 | jsonb_delete(jsonb,_text) |
- | jsonb | int4 | jsonb | 删除数组元素。 | jsonb_delete(jsonb,int4) |
#- | jsonb | _text | jsonb | 删除路径指定的值。 | jsonb_delete_path |
@? | jsonb | jsonpath | bool | JSON 路径是否存在。 | jsonb_path_exists_opr(jsonb,jsonpath) |
@@ | jsonb | jsonpath | bool | 匹配 JSON 路径谓词。 | jsonb_path_match_opr(jsonb,jsonpath) |
操作符类 4
声明输入类型与此类型相符的操作符类。多态操作符类、类型转换和表达式索引还可能提供其他索引路径;不能仅凭此表判断是否支持索引。
版本比较
PostgreSQL 17 → 18。属性比较不包含构建标识和说明正文;原始目录字段与源描述保留原文。
这两个样本的系统目录和结构化属性没有变化。
文档与源码
- 构建
- 18.6 · https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2
- 指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f
相关条目
全部数据类型 · 下载此版本 JSON · 最早收录的样本不代表该类型的实际引入版本。