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

    用图表表示如下图

  • 相关阅读:
    设计模式整理_单例设计模式
    设计模式整理_工厂模式
    设计模式整理_装饰者模式
    设计模式整理_观察者模式
    设计模式整理_策略模式
    JavaSE复习_7 异常
    JavaSE复习_6 枚举类
    JavaSE复习_5 Eclipse的常见操作
    pta编程题19 Saving James Bond 2
    ImportError: No module named PIL
  • 原文地址:https://www.cnblogs.com/ingxx/p/15880021.html
Copyright © 2020-2023  润新知