开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
引言
昨天介绍了 PostgreSQL(二) —— Character 字符数据类型,今天介绍另一种特殊的字符串数据类型,JSON数据类型。
JSON Types
JSON 数据类型用于存储 JSON(JavaScript Object Notation)数据,如 RFC 7159 中指定。JSON 数据也可以被存储为 text 数据类型,但是 JSON 数据类型的优势在于可以保证存储的数据符合 JSON 的规则的以及还有各种特定于 JSON 的函数和运算符可用于存储在这些数据类型中的数据。
PostgreSQL 提供了两种类型的存储 JSON 数据类型:json 和 jsonb。若要为 JSON 数据类型实现高效的查询机制,PostgreSQL 还提供了 jsonpath 数据类型。
json 和 jsonb 数据类型接受的存储的值基本上相同,主要区别的区别在于效率。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 数据类型 | 备注 |
|---|---|---|
| string | text | \u0000 是不允许的,因为这在 Unicode 转义表示数据库编码中不可用的字符 |
| number | numeric | NaN 和 infinity 的值是不被允许的 |
| boolean | boolean | 仅接受小写的 true 和 false 拼写 |
| null | (none) | SQL NULL 是一个不同的概念 |