MySQL中JSON数据类型详解

这篇具有很好参考价值的文章主要介绍了MySQL中JSON数据类型详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

概要及优点

JSON定义

JSON字段的增删改查操作

插入操作

查询操作

修改操作

删除操作

如何对JSON字段创建索引?

 加索引查询结果分析:

 不加索引查询结果分析:

使用JSON时的注意事项


概要及优点

        JSON数据类型是MySQL5.7.8开始支持的。在此之前,只能通过字符类型(CHAR、VARCHAR或TEXT)来保存JSON文档。

JSO数据类型具有的优势:

  1. 在插入时能自动校验文档是否满足JSON格式的要求。
  2. 优化了存储格式,无需读取整个文档就能快速访问某个元素的值。
  3. 节省网络带宽,结合索引还能降低磁盘IO消耗。

JSON定义

        JSON 是 JavaScript Object Notation(JavaScript 对象表示法)的缩写,是一个轻量级的,基于文本的,跨语言的数据交换格式。易于阅读和编写。

JSON的基本数据类型:

  • 数值:十进制数,不能前导0,可以为负数或小数,还可以为e或E表示的指数。
  • 字符串:字符串必须用双引号括起来。
  • 布尔值:true、false。
  • 数组:一个由零或多个值组成的有序序列。每个值可以为任意类型。数组使用方括号[ ] 括起来,元素之间用逗号 分隔。

        [1, "abc", null, true, "11:05:00.000000", {"id": 1}]

  • 对象:一个由零或者多个键值对组成的无序集合。其中键必须是字符串,值可以为任意类型。对象使用花括号 { } 括起来,键值对之间使用逗号,分隔,键与值之间用冒号:分隔。

        {"db": ["mysql", "oracle"], "id": 123, "info": {"age": 20}}

  • 空值:null。

JSON字段的增删改查操作

插入操作

1)直接插入JSON格式的字符串

# 创建测试表
create table mytest(id BIGINT ,other json);

# 插入表数据
insert into mytest values(1,'[1, "abc", null, true, "00:00:00.000000"]');

MySQL中JSON数据类型详解

2)使用函数,常用的有JSON_ARRAY()和JSON_OBJECT()

  • JSON_ARRAY():用于构造JSON数组
# 使用json_array()函数插入
insert into mytest values(2,json_array(2,'abc',null,true,now()));

MySQL中JSON数据类型详解

  • JSON_OBJECT():用于构造JSON对象
# 使用json_object()函数插入
insert into mytest values(3,json_object('name','abc','time',now()));

MySQL中JSON数据类型详解

 注意:

        MySQL5.7.x版本,如果插入键重复则会使用第一个键对应的值。

                json_object('key1',10,'key2',20,'key1',30)    结果:{"key1": 10, "key2": 20} 

        MySQL8.0.x版本,如果插入键重复会使用最后出现的键对应的值。

                 json_object('key1',10,'key2',20,'key1',30)    结果:{"key1": 30, "key2": 20} 

查询操作

以此数据为查询元数据

MySQL中JSON数据类型详解 

 

1)JSON_EXTRACT(json_doc,path[,path] ...)

        json_doc是JSON文档,path是路径。该函数会从JSON文档提取指定路径(path)的元素。如果指定path不存在,会返回NULL。可指定多个path,匹配到的多个值会以数组形式返回。

数组的路径:

  • 通过下标来表示的。第一个元素的下标是0。
# 使用json_extract函数进行查询,通过下标来表示的。
select json_extract(other,'$[0]') as val from mytest;

MySQL中JSON数据类型详解

  • 通过 [ M to N ] 获取数组的子集。
    • MySQL5.7.x版本不支持,本人亲测。
    • MySQL8.0.x版本可以试一试,本人没有测试。
# 使用json_extract函数进行查询,通过[M to N] 获取数组的子集。
select json_extract(other,'$[0 to 1]') as val from mytest;

# 使用$[last-1 to last],这里的 last 代表最后一个元素的下标
select json_extract(other,'$[last-1 to last]') as val from mytest;

  • 通过 $[*],获取数组中的所有元素.
# 使用$[*],获取数组中的所有元素
select json_extract(other,'$[*]') as val from mytest;

MySQL中JSON数据类型详解

 对象的路径:

  • 通过KEY来表示的
# 如果 KEY 在路径表达式中不合法(譬如存在空格),则在引用这个 KEY 时,需用双引号括起来。

# 使用json_extract函数进行查询对象,通过 KEY 来获取属性值
select json_extract(other,'$.name') as val from mytest where id = 3;

MySQL中JSON数据类型详解

select json_extract(other,'$."test a"') as val from mytest where id = 3;

select json_extract(other,'$.testArr[0]') as val from mytest where id = 3;

注意:以上两种语法,在MySQL5.7.x版本不支持,可以在MySQL8.0.x版本试一试。

  • 通过 .* 获取对象中的所有元素
select json_extract(other,'$.*') as val from mytest where id = 3;

MySQL中JSON数据类型详解

# 网上其他示例:

# 这里的 $**.b 匹配 $.a.b 和 $.c.b
select json_extract('{"a": {"b": 1}, "c": {"b": 2}}', '$**.b');

# 结果:
[1, 2]

2)column->path

        column->path,包括后面讲到的 column->>path,都是语法糖,在实际使用的时候都会转化为 JSON_EXTRACT。

        column->path 等同于 JSON_EXTRACT(column, path) ,只能指定一个path。

注意:在MySQL5.7.x版本不支持,可以在MySQL8.0.x版本试一试。

select other->"$name" from mytest where id = 3;
  • column->>path

同 column->path 类似,只不过其返回的是字符串。以下三者是等价的。

  • JSON_UNQUOTE( JSON_EXTRACT(column, path) )
  • JSON_UNQUOTE(column -> path)
  • column->>path
select other->'$.name',json_extract(c2, "$.name"),json_unquote(c2->'$.name'),c2->>'$.name' from mytest;

注意:在MySQL5.7.x版本不支持,可以在MySQL8.0.x版本试一试。

修改操作

1)JSON_INSERT(json_doc, path, val[, path, val] ...)

        插入新值。

        仅当指定位置或指定 KEY 的值不存在时,才执行插入操作。另外,如果指定的 path 是数组下标,且 json_doc 不是数组,该函数首先会将 json_doc 转化为数组,然后再插入新值。

# 示例一:
select json_insert('1','$[0]',"10");

# 结果:
1

# 示例二:
select json_insert('1','$[1]',"10");

# 结果:
[1,"10"]

# 示例三:
select json_insert('["1","2"]','$[2]',"10");

# 结果:
["1", "2", "10"]

2)JSON_SET(json_doc, path, val[, path, val] ...)

        插入新值,并替换已经存在的值。

        如果指定位置或指定 KEY 的值不存在,会执行插入操作,如果存在,则执行更新操作。

set @j = '{ "a": 1, "b": [2, 3]}';

# 示例:
select json_set(@j, '$.a', 10, '$.c', '[true, false]');

#结果:
{"a": 10, "b": [2, 3], "c": "[true, false]"} 

3)JSON_REPLACE(json_doc, path, val[, path, val] ...)

        替换已经存在的值。

set @j = '{ "a": 1, "b": [2, 3]}';

# 示例:
select json_replace(@j, '$.a', 10, '$.c', '[true, false]');

# 结果:
{"a": 10, "b": [2, 3]}

删除操作

1)JSON_REMOVE(json_doc, path[, path] ...)

        删除 JSON 文档指定位置的元素。

# 数据格式:{"name":"123","time":"234"}
# 会删除other字段中的name属性及对应的值
select json_remove(other, '$.name') from mytest where  id = 3;


# 数据格式:other: ["a", ["b", "c"], "d", "e"]
# 会删除other字段中数组下标为1的值
select json_remove(other, '$.[1]') from mytest;

# 结果:
["a", "d", "e"]

# 会删除other字段中数组下标为1的值,再根据新的结果,删除下标为2的值
select json_remove(@j, '$[1]','$[2]') from mytest;

# 结果:
["a", "d"] 

# 会删除other字段中数组下标为1的值,再根据新的结果,删除下标为1的值
select json_remove(@j, '$[1]','$[1]') from mytest;

# 结果:
["a", "e"] 

如何对JSON字段创建索引?

同 TEXT,BLOB 字段一样,JSON 字段不允许直接创建索引。

对文档中的元素进行查询,就需要用到 MySQL 5.7 引入的虚拟列及函数索引。

# 创建表及索引
create table t ( c1 json, c2 varchar(10) as (JSON_UNQUOTE(c1 -> "$.name")), index (c2) );

# 插入数据
insert into t (c1) values  ('{"id": 1, "name": "a"}'), ('{"id": 2, "name": "b"}'), ('{"id": 3, "name": "c"}'), ('{"id": 4, "name": "d"}');

MySQL中JSON数据类型详解

 MySQL中JSON数据类型详解

MySQL中JSON数据类型详解 

 加索引查询结果分析:

explain select * from t where c2 = 'a';

MySQL中JSON数据类型详解

explain select json_extract(c1,'$.id') from t where c1->'$.name' = 'a';

MySQL中JSON数据类型详解

 以上可见,虚拟列和json类型的列结果分析是一样的。

 不加索引查询结果分析:

explain select * from t where c2 = 'a';

explain select json_extract(c1,'$.id') from t where c1->'$.name' = 'a';

MySQL中JSON数据类型详解

 注意:在创建虚拟列时需指定  JSON_UNQUOTE,将 c1 -> "$.name" 的返回值转换为字符串。

使用JSON时的注意事项

  1. 再MySQL8.0.13之前,不允许对BLOB、TEXT、GEOMETRY、JSON字段设置默认值。从MySQL8.0.13开始,取消了这个限制。
  2. 不允许直接创建索引,可创建函数索引。
  3. JSON列的最大大小和LONGBLOB(LONGTEXT)一样,都是4G.
  4. 插入时,单个文档的大小受到max_allowed_packet的限制,该参数最大是1G.

小知识:

        max_allowed_packet:指mysql服务器端和客户端再一次传送数据包的过程当中最大允许的数据包大小。

作者:筱白爱学习!!文章来源地址https://www.toymoban.com/news/detail-462597.html

到了这里,关于MySQL中JSON数据类型详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql中json类型数据查询

            mysql在5.7版本之后就开始支持json数据类型,并且mysql8.0版本对json的处理已经做的非常完善了。json数据类型的优点缺点可自己查询,本文主要介绍一些关于json数据类型的查询操作。 下面用这个表来执行查询演示: 插入几条数据 查询json对象指定属性值的数据 1、函数

    2024年02月13日
    浏览(36)
  • Mysql列的类型定义详解——史上最详细教程(含实战)

    目录 前言 一、整形类型 1.整数类型的附带属性 (1).类型名称后面的小括号 (2).unsigned (3).auto_increment 二、浮点数和定点数类型 1.类型表 2.三种类型的区别 (1).区别 (2).忠告 三、字符型 1.CHAR 类型和 VARCHAR 类型 (1).字符串字符(M) (2).实战类型 2.TEXT类型 (1).类型表 (2).特别注意 (3).实战

    2024年02月04日
    浏览(38)
  • 解锁Mysql中的JSON数据类型,怎一个爽字了得

    在实际业务开发中,随着业务的变化,数据的复杂性和多样性不断增加。传统的关系型数据库模型在这种情况下会显得受限,因为它们需要预先定义严格的数据模式,并且通常只能存储具有相同结构的数据。而面对非结构化或半结构化数据的存储和处理需求,选择使用非关系

    2024年02月20日
    浏览(32)
  • [MySQL]数据类型(图文详解)

    说明: 数值类型在定义时不加unsigned限定的,都会被创建为有符号数。 只能将数值类型范围内的数据插入表中。 在C/C++语言中,数据类型不匹配时,编译器可能会进行截断、隐式类型转化等方式将不同类型的数据相互赋值,在MySQL中这是不被允许的,在MySQL中数值类型是一种

    2024年02月12日
    浏览(27)
  • 【mysql】—— 数据类型详解

    序言: 本期我将大家认识关于 mysql 数据库中的基本数据类型的学习。通过本篇文章,我相信大家对mysql 数据类型的理解都会更加深刻。 目录 (一)数据类型分类 (二)数值类型 1、tinyint类型 2、bit类型 3、小数类型 float类型 decimal 4、字符串类型 char varchar char和varchar比较 日

    2024年02月14日
    浏览(29)
  • MySQL数据库基础:JSON函数各类操作一文详解

    很多日常业务场景都会用到json文件作为数据存储起来,而mysql5.7以上就提供了存储json的支撑。往常存储json一般都保留在pg库或者是hive库里面,现在mysql有了支持的话基本业务都可以用mysql来实现。现在mysql8.x版本对json字符出处理已经做的非常完善了。现在就让我们来详细了解

    2024年02月04日
    浏览(33)
  • 详解MySQL的常用数据类型

    MySQL支持很多数据类型,以便我们能在复杂的业务场景中支持各种各样的数据格式,存储适当的数据内容。我们在设计数据库时,正确的使用数据库类型对整个数据库的整洁和高效,会有很大的帮助。 MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)

    2024年02月12日
    浏览(28)
  • Mysql系列 - 第2天:详解mysql数据类型(重点)

    这是mysql系列第2篇文章。 环境:mysql5.7.25,cmd命令中进行演示。 介绍mysql中常用的数据类型 mysql类型和java类型对应关系 数据类型选择的一些建议 主要包括以下五大类 整数类型 : bit 、 bool 、 tinyint 、 smallint 、 mediumint 、 int 、 bigint 浮点数类型 : float 、 double 、 decimal 字符

    2024年02月11日
    浏览(31)
  • Mysql数据库的优点

    功能强大 MySQL中提供了多种数据库存储引擎,各引擎各有所长,适用于不同的应用场合,用户可以选择最合适的引擎以得到最高性能,可以处理每天访问量超过数亿的高强度的搜索 Web 站点。MySQL5 支持事务、视图、存储过程、触发器等。 支持跨平台 MySQL支持至少20种以上的开

    2024年03月14日
    浏览(30)
  • MYSQL中JSON类型介绍

    在mysql未支持json数据类型时,我们通常使用varchar、blob或text的数据类型存储json字符串,对mysql来说,用户插入的数据只是序列化后的一个普通的字符串,不会对JSON文档本身的语法合法性做检查,文档的合法性需要用户自己保证。在使用时需要先将整个json对象从数据库读取出

    2024年02月15日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包