Loading

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
);	

这样就创建了一个订单表featurJSON类型

注意

  • 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文件中的注释部分

用图表表示如下图

posted @ 2022-02-10 17:15  ingxx  阅读(2613)  评论(0编辑  收藏  举报