PostgreSQL(三) —— JSON Types

180 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

引言

昨天介绍了 PostgreSQL(二) —— Character 字符数据类型,今天介绍另一种特殊的字符串数据类型,JSON数据类型。

JSON Types

JSON 数据类型用于存储 JSON(JavaScript Object Notation)数据,如 RFC 7159 中指定。JSON 数据也可以被存储为 text 数据类型,但是 JSON 数据类型的优势在于可以保证存储的数据符合 JSON 的规则的以及还有各种特定于 JSON 的函数和运算符可用于存储在这些数据类型中的数据。

PostgreSQL 提供了两种类型的存储 JSON 数据类型:jsonjsonb。若要为 JSON 数据类型实现高效的查询机制,PostgreSQL 还提供了 jsonpath 数据类型。

jsonjsonb 数据类型接受的存储的值基本上相同,主要区别的区别在于效率。json 类型存储的数据与输入的数据一致,但是如果用 json 处理函数来操作数据的话,每次都要对数据进行重新解析。jsonb 类型存储的数据转化为二进制数据进行存储,因为在数据存储时进行了转换,所以存储时略慢,但是因为不用重新解析数据,处理的速度增快。jsonb 同样也支持建立索引,这可能也是一个优势。

由于 json 类型存储输入文本的精确副本,因此它将保留标记之间语义上无关紧要的空格,以及 JSON 对象中键的顺序。此外,如果值中的 JSON 对象多次包含相同的键,则会保留所有键/值对(JSON 处理函数则只会保留相同键的最后一个值作为这个键值对的值)。相反 jsonb 类型不保留空格,不保留对象键的顺序,也不保留重复的对象键。如果在输入中指定了重复键,则仅保留最后一个值。

通常,大多数应用程序应该更喜欢将 JSON 数据存储为 jsonb,除非有相当特殊的需求,假如对所存储的 JSON 对象键排序有严格要求。值得注意的是,PgSQL 许多 JSON 处理函数会将 Unicode 转义转换为常规字符,因此,即使它们的输入是 json 类型而不是 jsonb 类型,也会抛出刚才描述的相同类型的错误。

下表是 JSON 基本数据类型在 PostgreSQL 中的实现,因此,对于构成有效 jsonb 数据的内容有一些小的附加约束,这些约束不适用于 json 类型,也不适用于抽象中的 JSON,对应于对基础数据类型可以表示的内容的限制。值得注意的是,jsonb 将拒绝 PostgreSQL 数值数据类型范围之外的数字,而 json 不会。

JSON 基本类型PostgreSQL 数据类型备注
stringtext\u0000 是不允许的,因为这在 Unicode 转义表示数据库编码中不可用的字符
numbernumericNaN 和 infinity 的值是不被允许的
booleanboolean仅接受小写的 true 和 false 拼写
null(none)SQL NULL 是一个不同的概念