没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
MySQL
基础语法——JSON 数据类型
MySQL 支持由 RFC 7159 定义的原生 JSON 数据类型,该数据类型能够高效访问 JSON
(JavaScript 对象表示法)文档中的数据。与将 JSON 格式字符串存储在字符串列中
相比,JSON 数据类型具有以下优势:
自动验证存储在 JSON 列中的 JSON 文档。无效文档会产生错误。
优化的存储格式。存储在 JSON 列中的 JSON 文档被转换为允许快速读取文档元
素的内部格式。当服务器稍后必须读取以这种二进制格式存储的 JSON 值时,不
需要从文本表示中解析该值。二进制格式的结构使服务器能够直接通过键或数
组索引查找子对象或嵌套值,而无需读取文档中它们之前或之后的所有值。
MySQL 9.0 还支持 RFC 7396 中定义的 JSON 合并补丁格式,使用 JSON_Merge_Patch
()函数。
注:
本讨论使用单类型的 JSON 来具体表示 JSON 数据类型,使用常规字体的“JSON”来表
示一般的 JSON 数据。
存储 JSON 文档所需的空间与 LONGBLOB 或 LONGTEXT 大致相同;重要的是要记住,
存储在 JSON 列中的任何 JSON 文档的大小都限制在 max_allowed_packet 系统变量的
值内。(当服务器在内存中内部操作 JSON 值时,它可以大于此值;当服务器存储
它时,限制适用。)您可以使用 JSON_STORAGE_SIZE()函数获得存储 JSON 文档所
需的空间量;请注意,对于 JSON 列,存储大小(以及此函数返回的值)是列在可
能对其执行任何部分更新之前使用的存储大小。
除了 JSON 数据类型,还有一组 SQL 函数可用于对 JSON 值进行操作,如创建、操作
和搜索。以下讨论显示了这些操作的示例。
还提供了一组用于对 GeoJSON 值进行操作的空间函数。
JSON 列与其他二进制类型的列一样,不直接索引;相反,您可以在生成的列上创建
一个索引,从 JSON 列中提取标量值。
MySQL 优化器还会在匹配 JSON 表达式的虚拟列上查找兼容的索引。
InnoDB 存储引擎支持 JSON 数组上的多值索引。
MySQL NDB Cluster 支持 JSON 列和 MySQL JSON 函数,包括在从 JSON 列生成的列上
创建索引,作为无法为 JSON 列建立索引的解决方法。每个 NDB 表最多支持 3 个 JSON
列。
JSON 值的部分更新
在 MySQL 9.0 中,优化器可以对 JSON 列执行部分就地更新,而不是删除旧文档并将
新文档全部写入该列。可以对满足以下条件的更新执行此优化:
正在更新的列被声明为 JSON。
UPDATE 语句使用 JSON_SET()、JSON_REPLACE()或 JSON_REMOVE()三个
函数中的任何一个来更新列。列值的直接赋值(例如,UPDATE mytable SET
jcol='{“A”:10,“b”:25}')不能作为部分更新执行。
通过这种方式可以优化单个 UPDATE 语句中多个 JSON 列的更新;MySQL 只能对那些
使用刚才列出的三个函数更新值的列执行部分更新。
输入列和目标列必须是同一列;诸如 UPDATE mytable SET jcol1=JSON_SET(jcol2,
'$.a',100)之类的语句不能作为部分更新执行。
只要输入列和目标列相同,更新就可以以任何组合使用对上一项中列出的任何函数
的嵌套调用。
所有更改都会用新值替换现有数组或对象值,并且不会向父对象或数组添加任
何新元素。
被替换的值必须至少与替换值一样大。换句话说,新值不能大于旧值。
当之前的部分更新为较大的值留下了足够的空间时,可能会出现此要求的例外情况。
您可以使用函数 JSON_STORAGE_FREE()查看 JSON 列的任何部分更新释放了多少
空间。
这种 部分更新可以使用节省空间的紧凑格式写入 二进 制日志;这可以通过将
binlog_row_value_options 系统变量设置为 PARTIAL_JSON 来启用。
区分存储在表中的 JSON 列值的部分更新与将行的部分更新写入二进制日志非常重
要。JSON 列的完整更新可以作为部分更新记录在二进制日志中。当前一个列表中的
最后两个条件中的任何一个(或两个)未得到满足,但其他条件得到满足时,可能
会发生这种情况。
接下来的几节将提供有关创建和操作 JSON 值的基本信息。
创建 JSON 值
JSON 数组包含一系列用逗号分隔并用 [ and ] 字符括起来的值:
["abc", 10, null, true, false]
JSON 对象包含一组键值对,用逗号分隔,用{和}字符括起来:
{"k1": "value", "k2": 10}
如示例所示,JSON 数组和对象可以包含字符串或数字、JSON 空文本或 JSON 布尔真
或假文本等标量值。JSON 对象中的键必须是字符串。也允许使用时间(日期、时间
或日期时间)标量值:
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
JSON 数组元素和 JSON 对象键值中允许嵌套:
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
您还可以从 MySQL 为此目的提供的许多函数中获取 JSON 值,以及使用 CAST(值 as
JSON)将其他类型的值转换为 JSON 类型。接下来的几段描述了 MySQL 如何处理作
为输入提供的 JSON 值。
在 MySQL 中,JSON 值被写成字符串。MySQL 解析在需要 JSON 值的上下文中使用的
任何字符串,如果它不是有效的 JSON,则会产生错误。这些上下文包括将值插入到
具有 JSON 数据类型的列中,并将参数传递给需要 JSON 值的函数(在 MySQL JSON
函数的文档中通常显示为 JSON.doc 或 JSON_val),如下例所示:
如果值是有效的 JSON 值,则尝试将值插入 JSON 列成功,否则失败:
mysql> CREATE TABLE t1 (jdoc JSON);
Query OK, 0 rows affected (0.20 sec)
mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.
此类错误消息中“位置 N”的位置是从 0 开始的,但应被视为值中问题实际发生位置
的粗略指示。
JSON_TYPE()函数需要一个 JSON 参数,并尝试将其解析为 JSON 值。如果有效,
它将返回值的 JSON 类型,否则将产生错误:
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY |
+----------------------------+
mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING |
+----------------------+
mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
MySQL 使用 utf6mb4 字符集和 utf8mb4_bin 排序规则处理 JSON 上下文中使用的字符
串。其他字符集中的字符串根据需要转换为 utf8mb4。(对于 ascii 或 utf8mb3 字符
集中的字符串,不需要转换,因为 ascii 和 utf8mb3 是 utf8mb4 的子集。)
作为使用文字字符串编写 JSON 值的替代方法,存在用于从组件元素组合 JSON 值的
函数。JSON_ARRAY()接受一个(可能为空)值列表,并返回一个包含这些值的 JSON
数组:
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW()) |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
剩余24页未读,继续阅读
资源评论
icysmile131
- 粉丝: 4625
- 资源: 650
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功