MySQL JSON 数据类型
MySQL JSON 数据类型
从 MySQL 5.7.8 开始,MySQL 支持由RFC 7159定义的本机JSON
数据类型
在没有JSON
格式之前在创建时可能会使用BLOB或者TEXT或者VARCHAR来存储,在项目中使用反序列化的方式转换为对应的对象
在有JSON
后该类型可有效访问 JSON文档中的数据。与将 JSON 格式的字符串存储在字符串列中相比,JSON
数据类型具有以下优点:
- 自动验证存储在
JSON
列中的 JSON 文档。无效的文档会产生错误。 - 优化的存储格式。存储在
JSON
列中的 JSON 文档将转换为内部格式,从而可以快速读取文档元素。当服务器稍后必须读取以该二进制格式存储的 JSON 值时,则无需从文本 table 示形式解析该值。二进制格式的结构使服务器可以直接通过键或数组索引查找子对象或嵌套值,而无需读取文档中它们之前或之后的所有值。
先简单创建一个表
CREATE TABLE `order` (
id INT(11) PRIMARY KEY,
feature JSON
);
这样就创建了一个订单表featur
为JSON
类型
注意
JSON
列不能具有非NULL
的默认值- 存储
JSON
文档所需的空间与LONGBLOB或LONGTEXT大致相同 - 存储在
JSON
列中的任何 JSON 文档的大小都限于max_allowed_packet系统变量的值
至于为什么会有以上的限制下面会解释
JSON操作函数
点击Name可以跳转到对应的使用方法
Name | Description | Introduced | Deprecated |
---|---|---|---|
-> |
JSON 列返回值;相当于 JSON_EXTRACT()。 | ||
->> |
评估路径并取消引用结果后从 JSON 列返回值;相当于 JSON_UNQUOTE(JSON_EXTRACT()) | 5.7.13 | |
JSON_APPEND() |
将数据附加到 JSON 文档 | Yes | |
JSON_ARRAY() |
创建 JSON 数组 | ||
JSON_ARRAY_APPEND() |
将数据添加到 JSON数组 | ||
JSON_ARRAY_INSERT() |
插入 JSON 数组 | ||
JSON_CONTAINS() |
JSON 文档是否在路径中包含特定对象 | ||
JSON_CONTAINS_PATH() |
JSON 文档是否在路径中包含任何数据 | ||
JSON_DEPTH() |
JSON 文档的最大深度 | ||
JSON_EXTRACT() |
从 JSON 文档返回数据 | ||
JSON_INSERT() |
将数据插入 JSON 文档 | ||
JSON_KEYS() |
JSON 文档中的键数组 | ||
JSON_LENGTH() |
JSON 文档中的元素数 | ||
JSON_MERGE() |
合并 JSON 文档,保留重复的键。 JSON_MERGE_PRESERVE()的已弃用同义词 | 5.7.22 | |
JSON_MERGE_PATCH() |
合并 JSON 文档,替换重复键的值 | 5.7.22 | |
JSON_MERGE_PRESERVE() |
合并 JSON 文档,保留重复的键 | 5.7.22 | |
JSON_OBJECT() |
创建 JSON 对象 | ||
JSON_PRETTY() |
以易于阅读的格式打印 JSON 文档 | 5.7.22 | |
JSON_QUOTE() |
引用 JSON 文档 | ||
JSON_REMOVE() |
从 JSON 文档中删除数据 | ||
JSON_REPLACE() |
替换 JSON 文档中的值 | ||
JSON_SEARCH() |
JSON 文档中值的路径 | ||
JSON_SET() |
将数据插入 JSON 文档 | ||
JSON_STORAGE_SIZE() |
用于存储 JSON 文档的二进制 table 示形式的空间 | 5.7.22 | |
JSON_TYPE() |
JSON 值类型 | ||
JSON_UNQUOTE() |
取消引用 JSON 值 | ||
JSON_VALID() |
JSON 值是否有效 |
注意
- 当不是
JSON
列时也可以使用上面的函数 - 当使用上面函数对JSON文档修改时MySQL还会在原始 JSON 文档中的键,值或元素之间舍弃多余的空格,并在显示时在每个逗号(
,
)或冒号(:
)后留一个空格(或在必要时插入)。这样做是为了提高可读性。 - 为了使查找更有效率,它还会对 JSON 对象的键进行排序。 您应注意,此排序的结果可能会更改,并且不能保证在各个发行版中都保持一致。
JSON在MySQL中是如何存储的
JSON数据在存储时和我们以前的存储没什么区别也是使用BLOB,MySQL支持JSON
做法是在server层提供了便于操作JSON的函数,在存储还是把JSON编码为BLOB,然后交给存储引擎层,所以InnoDB和MyISAM都可以支持JSON
列,这也解释了文章开头所说的注意事项
至于怎么转换为BLOB存储可以看json_binary.h文件中的注释部分
用图表表示如下图