JSON是数据传输与存储 数据格式,在微服务中大量使用,重点翻译下MySQL官方对JSON的支持,方便后期业务JSON数据处理工作。
JSON数据类型
从MySQL 5.7.8开始,MySQL支持RFC 7159JSON
定义的本机数据类型 ,可以高效访问JSON(JavaScript Object Notation)文档中的数据。与在字符串列中存储JSON格式字符串相比,数据类型具有以下优势: JSON
-
存储在
JSON
列中的JSON文档的自动验证 。无效的文档会产生错误。 -
优化的存储格式。存储在
JSON
列中的JSON文档将 转换为内部格式,以允许对文档元素进行快速读取访问。当服务器稍后必须读取以该二进制格式存储的JSON值时,不需要从文本表示中解析该值。二进制格式的结构使服务器能够直接通过键或数组索引查找子对象或嵌套值,而无需在文档之前或之后读取所有值。
注意
此讨论使用JSON
monotype来指定JSON数据类型和 常规字体中的“ JSON ”以指示一般的JSON数据。
存储JSON
文档所需的空间与LONGBLOB
或 大致相同LONGTEXT
; 有关更多信息,请参见 第11.8节“数据类型存储要求”。请务必记住,JSON
列中存储的任何JSON文档的大小都限制为max_allowed_packet
系统变量的值。(当服务器在内存中内部操作JSON值时,它可能大于此值;当服务器存储时,该限制适用。)
一JSON
列不能有非NULL
默认值。
除了JSON
数据类型之外,还有一组SQL函数可用于对JSON值进行操作,例如创建,操作和搜索。以下讨论显示了这些操作的示例。有关各个函数的详细信息,请参见第12.17节“JSON函数”。
还提供了一组用于操作GeoJSON值的空间函数。请参见第12.16.11节“空间GeoJSON函数”。
JSON
列,如其他二进制类型的列,不直接索引; 相反,您可以在生成的列上创建索引,该列从列中提取标量值 JSON
。有关详细示例,请参阅 索引生成的列以提供JSON列索引。
MySQL优化器还在与JSON表达式匹配的虚拟列上查找兼容索引。
MySQL NDB Cluster 7.5(7.5.2及更高版本)支持 JSON
列和MySQL JSON函数,包括在列生成的JSON
列上创建索引 ,作为无法索引JSON
列的变通方法。JSON
每个NDB
表最多支持3列 。
接下来的几节提供了有关JSON值的创建和操作的基本信息。
创建JSON值
JSON数组包含一个由逗号分隔的值列表,并包含在 字符[
和]
字符中:
JSON对象包含一组由逗号分隔的键值对,并包含在字符{
和 }
字符中:
如示例所示,JSON数组和对象可以包含字符串或数字的标量值,JSON空文字或JSON布尔值true或false文字。JSON对象中的键必须是字符串。时间(日期,时间或日期时间)标量值也是允许的:
在JSON数组元素和JSON对象键值中允许嵌套:
您还可以为此目的从MySQL提供的许多函数中获取JSON值 以及JSON
使用其他类型的值转换为类型 。接下来的几段描述了MySQL如何处理作为输入提供的JSON值。
在MySQL中,JSON值被写为字符串。MySQL解析JSON值的上下文中使用的任何字符串,如果它作为JSON无效则会产生错误。这些上下文包括将值插入到具有JSON
数据类型的列中, 并将参数传递给期望JSON值的函数(通常显示为 json_doc
或 json_val
在MySQL JSON函数的文档中),如以下示例所示:
JSON
如果值是有效的JSON值,则 尝试将值插入列成功,但如果不是,则尝试失败:
该JSON_TYPE()
函数需要一个JSON参数并尝试将其解析为JSON值。如果值有效,则返回值的JSON类型,否则产生错误:
MySQL使用utf8mb4
字符集和utf8mb4_bin
排序规则处理JSON上下文中使用的 字符串 。其他字符集中的字符串将utf8mb4
根据需要进行转换。(对于在串ascii
或 utf8
字符集,则不需要转换,因为ascii
和utf8
都是的子集utf8mb4
。)
作为使用文字字符串编写JSON值的替代方法,存在用于从组件元素组成JSON值的函数。JSON_ARRAY()
获取(可能为空)值列表并返回包含这些值的JSON数组:
JSON_OBJECT()
获取(可能为空)键值对列表并返回包含这些对的JSON对象:
JSON_MERGE()
获取两个或多个JSON文档并返回组合结果:
有关合并规则的信息,请参阅 JSON值的规范化,合并和自动包装。
可以将JSON值分配给用户定义的变量:
但是,用户定义的变量不能是 JSON
数据类型,所以虽然 @j
在前面的例子中看起来像一个JSON值并且具有相同的字符集和归类为JSON值,但它不具有 JSON
数据类型。相反,结果from JSON_OBJECT()
在分配给变量时会转换为字符串。
通过转换JSON值生成的字符串具有以下字符集utf8mb4
和排序规则 utf8mb4_bin
: