广告
返回顶部
首页 > 资讯 > 数据库 > MySQL数据类型 - JSON数据类型 (2)
  • 901
分享到

MySQL数据类型 - JSON数据类型 (2)

摘要

JSON值的规范化、合并和自动包装 当一个字符串被解析并发现是一个有效的JSON文档时,它也会被规范化。这意味着,具有与稍后在文档中找到的键(从左到右)重复的键的成员将被丢弃。jsON_OBJECT()调用生成的对象值只包含第二个key1元


	MySQL数据类型 - JSON数据类型 (2)
[数据库教程]

JSON值的规范化、合并和自动包装

当一个字符串被解析并发现是一个有效的JSON文档时,它也会被规范化。这意味着,具有与稍后在文档中找到的键(从左到右)重复的键的成员将被丢弃。jsON_OBJECT()调用生成的对象值只包含第二个key1元素,因为该键名在之前值中出现过,如下所示:

技术图片

在JSON列中插入值时也会执行规范化,如下所示:

技术图片
这种"最后一次重复的键获胜"的行为是由RFC 7159建议的,并且已由大多数javascript解析器实现。(Bug #86866, Bug #26369555)

Mysql 8.0.3之前的版本中,与文档中先前找到的key重复的key成员将被丢弃。以下JSON_OBJECT()调用生成的对象值不包括第二个key1元素,因为该键名在前面出现过:
技术图片

mysql 8.0.3之前,在向JSON列中插入值时,也会执行"第一个重复键获胜"的规范化。

技术图片

Mysql还会丢弃原始JSON文档中键、值或元素之间的多余空格,并在显示时在每个逗号(,)或冒号(:)后保留(或在必要时插入)一个空格。这样做是为了提高可读性。

产生JSON值的MySQL函数总是返回规范化的值。

为了提高查找效率,MySQL还对JSON对象的键进行排序。应该意识到,此排序的结果可能会发生更改,并且不能保证在不同版本之间保持一致。

合并JSON值

MySQL8.0.3(及更高版本)支持两种合并算法,由函数JSON_MERGE_PRESERVE()和JSON_MERGE_PATCH()实现。它们在处理重复键的方式上有所不同:JSON_MERGE_PRESERVE()保留重复键的值,而JSON_MERGE_PATCH()将丢弃除最后一个值之外的所有值。接下来的几段将解释这两个函数如何处理JSON文档的不同组合(即对象和数组)的合并。

注意

JSON_MERGE_PRESERVE()与早期版本的MySQL(在MySQL 8.0.3中重命名)中的JSON_MERGE()函数相同。在MySQL8.0中,JSON_MERGE()仍然以JSON_MERGE_PRESERVE()别名被支持,但已弃用,并可能在将来的版本中删除。

合并数组。在组合多个数组的上下文中,数组被合并成一个。JSON_MERGE_PRESERVE()通过将后面提及的数组连接到第一个数组的末尾来实现这一点。JSON_MERGE_PATCH()将每个参数视为一个由单个元素组成的数组(因此其索引为0),然后应用"最后一个重复键获胜"逻辑来仅选择最后一个参数。您可以比较此查询显示的结果:
技术图片

多个对象合并后生成一个对象。JSON_MERGE_PRESERVE()把数组中具有相同键的对象各唯一值合并;然后将该数组用作结果中该键的值。JSON_MERGE_PATCH()从左到右丢弃找到重复键的值,这样结果只包含该键的最后一个值。以下查询说明了重复键a的结果差异:
技术图片

在需要数组值的上下文中使用非数组值是会自动包装的:该值由[和]字符包围以将其转换为数组。在下面的语句中,每个参数都自动包装为一个数组([1],[2])。然后将这些值合并生成一个结果数组;与前两种情况一样,JSON_MERGE_PRESERVE()组合具有相同键的值,而JSON_MERGE_PATCH()将丢弃除最后一个外的所有重复键的值,如下所示:
技术图片

数组和对象值的合并是通过将对象自动包装为一个数组,并通过合并值来合并数组,或者根据"最后的重复键获胜"原则(分别对应选择的合并函数是JSON_MERGE_PRESERVE()或JSON_MERGE_PATCH())合并数组,如本例所示:
技术图片

搜索和修改JSON值

JSON路径表达式在JSON文档中选择一个值。

路径表达式指定操作文档位置,对于提取或修改JSON文档内容的函数非常有用。例如,以下查询从JSON文档中提取具有name键的成员的值:
技术图片

路径语法使用前导的$字符来表示处理中的JSON文档,后面可以跟选择器(可选),这些选择器依次指示文档中更具体的部分:

●一个句点后跟一个键名,用给定的键命名对象中的成员。如果不带引号的键名称在路径表达式中不合法(例如,如果它包含空格),则必须用在双引号包含指定键名称。

● [N]附加到选择数组的路径后,表示在数组中位置N处的值。数组位置是以零开头的整数。如果路径未选择数组值,则路径[0]的计算结果与路径相同:

技术图片

●[M to N]指定数组值的子集或范围,从位置M处的值开始,到位置N处的值结束。

支持用last作为最右边数组元素的索引的同义词。还支持数组元素的相对寻址。如果path没有选择数组值,path[last]的计算结果与path相同,如本节后面部分所示。

●路径可以包含*或**通配符:

■ .[*]计算JSON对象中所有成员的值。

■ [*]计算JSON数组中所有元素的值。

■ prefix**suffix计算以prefix开头、以suffix结束的所有路径。

● 文档中不存在的路径(计算结果为不存在的数据)计算结果为NULL。

让$引用包含三个元素的JSON数组:
技术图片

然后:

● $[0]的计算结果为3。

● $[1]的计算结果为{"a": [5, 6], "b": 10}。

● $[2]的计算结果为[99, 100]。

● $[3]的计算结果为NULL(它引用第四个数组元素,它不存在)。

由于$[1]和$[2]的计算结果为非标量值,因此可以用更具体的路径表达式对它们选择嵌套的值。示例:

●$[1].a的计算结果为[5, 6]。

●$[1].a[1]的计算结果为6。

●$[1].b的值为10。

●$[2][0]的计算结果为99。

如前所述,如果未加引号的键名称在路径表达式中不合法,则必须用引号将键引起。让$来引用此值:
技术图片

两个键都包含空格,必须用引号引用:

●$."a fish"的计算结果是shark。

●$."a bird"的计算结果是sparrow。

使用通配符的路径计算的数组可以包含多个值:

技术图片

在以下示例中,路径$**.b计算为多个路径($.a.b和$.c.b),并生成匹配路径值的数组:

技术图片

JSON数组区间。可以使用带有to关键字的区间来指定JSON数组的子集。例如,$[1 to 3]包括数组的第二、第三和第四个元素,如下所示:

技术图片

语法是 M to N,其中M和N分别是JSON数组中一系列元素的第一个和最后一个索引。N必须大于M;M必须大于或等于0。数组元素以0开头编制索引。

可以在支持通配符的上下文中使用区间。

官方文档地址:
https://dev.mysql.com/doc/refman/8.0/en/json.html

MySQL数据类型 - JSON数据类型 (2)

原文地址:Https://blog.51cto.com/15023289/2560982

您可能感兴趣的文档:

--结束END--

本文标题: MySQL数据类型 - JSON数据类型 (2)

本文链接: https://www.lsjlt.com/news/7985.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL数据类型 - JSON数据类型 (2)
    JSON值的规范化、合并和自动包装 当一个字符串被解析并发现是一个有效的JSON文档时,它也会被规范化。这意味着,具有与稍后在文档中找到的键(从左到右)重复的键的成员将被丢弃。JSON_OBJECT()调用生成的对象值只包含第二个key1元...
    99+
    2019-09-03
    MySQL数据类型 - JSON数据类型 (2) 数据库入门 数据库基础教程 数据库 mysql
  • MySQL数据类型 - JSON数据类型 (3)
    最右边的数组元素。MySQL支持last关键字,作为数组中最后一个元素的索引的同义词。last - N 形式的表达式可用于相对寻址和范围定义,如下所示: 如果不是针对数组计算路径,则求值结果与将该值包装在单个元素数组中的结果相同: 可以使...
    99+
    2021-03-13
    MySQL数据类型 - JSON数据类型 (3) 数据库入门 数据库基础教程 数据库 mysql
  • MySQL数据类型 - JSON数据类型 (4)
    JSON值的比较和排序 JSON值可以使用=,=,,!=,和运算符进行比较。 JSON值尚不支持以下比较运算符和函数: ●BETWEEN ●IN() ●GREATEST() ●LEAST() 要想使用上面这些列出的比较运算符和函数,一个解决...
    99+
    2016-08-23
    MySQL数据类型 - JSON数据类型 (4) 数据库入门 数据库基础教程 数据库 mysql
  • java保存json类型数据到mysql数据库,mysql保存json类型数据
    1.首先在对应表添加一个json类型字段 2.在java对应的实体类添加对应的字段,重点是加上(typeHandler = JacksonTypeHandler.class)这个注解 不然的话保存...
    99+
    2023-09-04
    java mysql 数据库
  • 2.Python3 数据类型
    一、数据类型初识 1、数字2 是一个整数的例子。长整数 不过是大一些的整数。3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。(-5+4j)和(2.3-4.6j)是复数的例子,其中...
    99+
    2023-01-31
    数据类型
  • Mysql中json类型数据查询
            mysql在5.7版本之后就开始支持json数据类型,并且mysql8.0版本对json的处理已经做的非常完善了。json数据类型的优点缺点可自己查询,本文主要介绍一些关于json数据类型的查询操作。 下面用这个表来执行查询...
    99+
    2023-08-31
    mysql 数据库
  • MySQL数据类型 - 数据类型默认值
    数据类型默认值 数据类型规范可以有显式或隐式的默认值。 数据类型规范中的DEFAULT值子句显式指示列的默认值。示例: SERIAL DEFAULT VALUE是一种特殊情况。在整数列的定义中,它是NOT NULL AUTO_INCREM...
    99+
    2021-04-15
    MySQL数据类型 - 数据类型默认值 数据库入门 数据库基础教程 数据库 mysql
  • MySQL数据类型对应Java数据类型
    ### 数值类型 - TINYINT:大小(1byte),范围(有符号为-128到127,无符号为0到255),用于小整数值,对应于java中的Byte类型; - SMALLINT:大小(2byte),范围(有符号为-32768到3276...
    99+
    2023-09-07
    mysql java 数据库
  • MySQL的JSON 数据类型有哪些
    小编给大家分享一下MySQL的JSON 数据类型有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MySQL 5.7 增加了 ...
    99+
    2022-10-18
  • Redis入门(2) - 数据类型
    Redis中的数据类型 字符串 散列 列表 集合 有序集合 Redis中的数据类型 Redis定义了这几种数据类型: string(字符串) hash(散列) list(列表) set(集合) zset(有序集合) 后面会介...
    99+
    2017-07-10
    Redis入门(2) - 数据类型
  • MySQL数据类型--------整数类型实战
    1. 背景 * MySQL支持SQL标准整数类型整数(或INT)和SMALLINT。作为标准的扩展,MySQL还支持整数类型TINYINT、MEDIUMINT和BIGINT2.  整数类...
    99+
    2022-10-18
  • MySQL 数据类型
      1、数值型 类型                     范围、小数位数 TINYINT (-128,127) SMALLINT 正负3w+ MEDIUMINT 正负800w+ INT 正负21亿+ B...
    99+
    2018-12-08
    MySQL 数据类型
  • mysql数据类型
    1.整型(整数类型) create table t2(id int(5) unsigned zerofill); 注意:   ①int后面的5表示的是显示宽度(就是你select * from t2;时看到的数字最大长度...
    99+
    2020-10-18
    mysql数据类型
  • MySQL 数据类型
    MySQL 数据类型MySQL中定义数据字段的类型对你数据库的优化是非常重要的。MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。数值类型MySQL支持所有标准SQL数值数据类...
    99+
    2022-10-18
  • 【MySQL】数据类型
    前言 在前一篇文章中,我们介绍了数据库的基本操作,而在插入表时涉及了许多关于表的数据类型,接下来就一起来学习一下MySQL常见的一些文件类型吧。 整形类型 数据类型字节最小值最大值TINYINT1-1...
    99+
    2023-09-24
    mysql
  • 【MySQL】MySQL数据类型
    文章目录 一、数据类型的分类二、tinyint类型2.1 创建有符号数值2.2 创建无符号数值 三、bit类型三、浮点类型3.1 float3.2 decimal类型 四、字符串类型4.1 char类型4.2 varchar...
    99+
    2023-08-22
    mysql android
  • 【MySQL】MySQL 数据类型
    目录 1. tinyint 类型 2. bit 类型 3. 小数类型 1、float 类型 2、decimal 类型 3. 字符串类型 1、char 类型  2、varchar 类型 4. 日期类型 5. enum和set 1、枚举和集合类...
    99+
    2023-09-07
    mysql 数据库
  • MySQL数据类型enum 枚举类型
    例如: 性别 gender 男 女 保密 基本语法: enum(数据值 1,数据值 2...); 数据值列表在 255 个以内,使用 1 个字节来存储数据值列表超过 255,但是小于...
    99+
    2022-11-13
  • MySQL中JSON字段数据类型详解
    目录前言创建jsON值搜索JSON类型数据在 JSON 和非 JSON 值之间转换JSON 值的汇总总结前言JSON 类型是从 mysql 5.7 版本开始支持的功能,MySQL 支持由RFC 7159定义的本机JSON数...
    99+
    2022-06-14
    mysql的json数据类型 数据库json类型 数据库json字段
  • MySQL 中怎么操作JSON数据类型
    今天就跟大家聊聊有关MySQL 中怎么操作JSON数据类型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。创建一个 JSON 字段的表首先先创建一个表...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作