MySQL 8.0中新增的功能(三)

字符集支持

默认字符集已从latin1更改为utf8mb4。utf8mb4字符集新增了几个排序规则,包括utf8mb4_ja_0900_as_cs,这是MySQL中首个用于Unicode的日语特定排序规则。

JSON增强功能

MySQL的JSON功能性方面进行了以下增强或添加:

  • ->> (内联路径)运算符是新增的功能,它等同于对JSON_EXTRACT()的结果调用JSON_UNQUOTE()函数。 这是MySQL 5.7引入的列路径运算符->的一个改进;col->>".path"等同于JSONU​NQUOTE(col−>"​.path")。内联路径运算符可以在任何可以使用 JSON_UNQUOTE(JSON_EXTRACT()) 的地方使用,比如 SELECT 查询的列列表、WHERE 和 HAVING 子句,以及 ORDER BY 和 GROUP BY 子句。
  • 新增了两个JSON聚合函数:JSON_ARRAYAGG()和JSON_OBJECTAGG()。

    JSON_ARRAYAGG()函数将列或表达式作为参数,并将结果聚合为一个单独的JSON数组。表达式可以评估为任何MySQL数据类型;它并不一定是一个JSON值。

    JSON_OBJECTAGG()函数接受两个列或表达式,将其解释为键和值,并将结果作为单个JSON对象返回。

  • 新增了JSON实用函数JSON_PRETTY(),它以易于阅读的格式输出现有的JSON值;每个JSON对象成员或数组值都会打印在单独的一行上,并且子对象或数组相对于其父级缩进2个空格。

    该函数还可以处理可以解析为JSON值的字符串,将其转换为易于阅读的格式。

  • 在查询中使用ORDER BY对JSON值进行排序时,现在每个值都由可变长度的排序键的一部分表示,而不是固定1K大小的一部分。在许多情况下,这可以减少过度使用内存的情况。例如,标量INT甚至BIGINT值实际上只需要很少的字节,因此剩余的空间(高达90%或更多)被填充占据。此更改对性能有以下好处:

    a.排序缓冲区空间的使用更有效,因此与固定长度排序键相比,无需尽早或频繁地将文件排序刷新到磁盘中。这意味着可以在内存中对更多数据进行排序,避免不必要的磁盘访问。
    b.较短的键比较起来比较快,提供了明显的性能改进。这对于完全在内存中执行的排序以及需要写入和读取磁盘的排序都适用。

  • 在MySQL 8.0.2中添加了对JSON列值的部分原地更新的支持,这比完全删除现有的JSON值并将其替换为新值的方式更高效。之前更新任何JSON列时都会采取这种方式。要应用此优化,必须使用JSON_SET()、JSON_REPLACE()或JSON_REMOVE()进行更新。不能向正在更新的JSON文档中添加新元素;文档中的值不能比更新之前占用更多的空间。详见关于JSON值的部分更新的详细讨论。

    部分更新的JSON文档可以写入二进制日志,占用的空间比记录完整的JSON文档要少。当使用基于语句的复制时,部分更新始终以此方式进行记录。要在基于行的复制中使用此功能,您首先必须设置binlog_row_value_options=PARTIAL_JSON;请参阅此变量的描述以获取更多信息。

  • 在MySQL 8.0.2中添加了JSON实用函数JSON_STORAGE_SIZE()和JSON_STORAGE_FREE()。

    JSON_STORAGE_SIZE()函数返回以字节为单位的存储空间,用于在进行任何部分更新(参见前一项)之前JSON文档的二进制表示。此函数还接受JSON文档的有效字符串表示形式作为参数。对于这样的值,JSON_STORAGE_SIZE()函数返回将其转换为JSON文档后其二进制表示使用的空间。如果参数无法解析为有效的JSON文档,则该函数会产生错误,如果参数为NULL,则返回NULL。

    JSON_STORAGE_FREE()函数显示类型为JSON的表列在使用JSON_SET()或JSON_REPLACE()进行部分更新后剩余的空间量;如果新值的二进制表示少于先前值的二进制表示,则此值大于零。与JSON_STORAGE_SIZE()类似,JSON_STORAGE_FREE()函数也接受JSON文档的有效字符串表示形式作为参数。对于包含JSON文档字符串表示的变量,JSON_STORAGE_FREE()函数返回零。如果参数无法解析为有效的JSON文档,则该函数会产生错误,如果参数为NULL,则返回NULL。

  • 在MySQL 8.0.2中,添加了对XPath表达式中类似[1to5]的范围的支持。此版本还添加了对last关键字和相对定位的支持,使得​[last]始终选择数组中的最后一个(编号最高的)元素,[last−1]选择倒数第二个元素。last和使用它的表达式还可以包含在范围定义中。例如,​[last-2 to last-1]返回数组中的倒数第二个和倒数第一个元素。

  • 在MySQL 8.0中,添加了一个名为JSON_MERGE_PATCH()的JSON合并函数,旨在符合RFC 7396规范。

    当将JSON_MERGE_PATCH()应用于两个JSON对象时,它将把它们合并为一个单独的JSON对象,该对象具有以下集合的成员:

    a. 对于第一个对象的每个成员,在第二个对象中没有具有相同键的成员。
    b. 对于第二个对象的每个成员,如果在第一个对象中没有具有相同键的成员,并且其值不是JSON的null字面值。
    c. 对于两个对象中都存在相同键的每个成员,其中第二个对象中的值不是JSON的null字面值。
    作为此工作的一部分,JSON_MERGE()函数已更名为JSON_MERGE_PRESERVE()。在MySQL 8.0中,JSON_MERGE()仍然被识别为JSON_MERGE_PRESERVE()的别名,但现已废弃并可能在未来的MySQL版本中被移除。

  • 在MySQL中,已实现了“最后重复键胜出”的重复键规范化,与RFC 7159和大多数JavaScript解析器保持一致。下面是一个示例,展示了这种行为,只有具有键x的最右边的成员被保留:

    mysql> SELECT JSON_OBJECT('x', '32', 'y', '[true, false]',> 'x', '"abc"', 'x', '100') AS Result;
    +------------------------------------+
    | Result |
    +------------------------------------+
    | {"x": "100", "y": "[true, false]"} |
    +------------------------------------+
    1 row in set (0.00 sec)

    在MySQL中,插入到JSON列的值也会按照“最后重复键胜出”的规则进行规范化,如下面的示例所示:

    mysql> CREATE TABLE t1 (c1 JSON);
    mysql> INSERT INTO t1 VALUES ('{"x": 17, "x": "red", "x": [3, 5, 7]}');
    mysql> SELECT c1 FROM t1;
    +------------------+
    | c1 |
    +------------------+
    | {"x": [3, 5, 7]} |
    +------------------+

    这是与先前版本的MySQL不兼容的更改,先前版本中,在这种情况下使用了“首次重复键优先”的算法。

  • 在MySQL 8.0.4中,添加了JSON_TABLE()函数。该函数接受JSON数据并将其作为具有指定列的关系表返回。

    JSON_TABLE()函数的语法为:JSON_TABLE(expr, path COLUMNS column_list) [AS alias],其中expr是返回JSON数据的表达式,path是应用于源的JSON路径,column_list是列定义的列表。下面是一个示例:

    mysql> SELECT *-> FROM-> JSON_TABLE(-> '[{"a":3,"b":"0"},{"a":"3","b":"1"},{"a":2,"b":1},{"a":0},{"b":[1,2]}]',-> "$[*]" COLUMNS(-> rowid FOR ORDINALITY,->-> xa INT EXISTS PATH "$.a",-> xb INT EXISTS PATH "$.b",->-> sa VARCHAR(100) PATH "$.a",-> sb VARCHAR(100) PATH "$.b",->-> ja JSON PATH "$.a",-> jb JSON PATH "$.b"-> )-> ) AS jt1;
    +-------+------+------+------+------+------+--------+
    | rowid | xa | xb | sa | sb | ja | jb   |
    +-------+------+------+------+------+------+--------+
    | 1     |  1 |  1 |  3 |  0 |  3 | "0"  |
    | 2     |  1 |  1 |  3 |  1 | "3"| "1"  |
    | 3     |  1 |  1 |  2 |  1 |  2 |   1  |
    | 4     |  1 |  0 |  0 |NULL|  0 | NULL |
    | 5     |  0 |  1 |NULL|NULL|NULL|[1, 2]|
    +-------+------+------+------+------+------+--------+

    JSON_TABLE()函数中的表达式部分可以是任何生成有效的JSON文档的表达式,包括JSON字面量、表列或返回JSON的函数调用,比如JSON_EXTRACT(t1, data, '$.post.comments')。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/602616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 POST http://x.x.x.x:8000/aaa/ net::ERR_CONNECTION_TIMED_OUT

记录一下我遇到的问题和解决办法 我的项目前后端分离,在前端用的vue访问后端时连接不上后端,一切操作都触发不了后端,数据也传不到后端去; 原因:url有问题,url地址写的不是本机,所以导致连接超…

vector_01_使用vector第一步是什么?

C 中使用vector来存储数据&#xff0c;其打开方式是什么&#xff1f; 开始第一步&#xff0c;定义一个vector类型的变量&#xff0c;try 一try。 #include <iostream> #include <utility> // #include <vector> /*先注释&#xff0c;编译器会报什么错误&am…

UE5.1_UMG序列帧动画制作

UE5.1_UMG序列帧动画制作 UMG序列帧动画制作相对比较简单&#xff0c;不像视频帧需要创建媒体播放器那么复杂&#xff0c;以下简要说明&#xff1a; 1. 事件函数 2. 准备序列帧装入数组 3. 构造调用事件函数 4. 预览 序列帧UMG0105 5. 完成&#xff01;按需配置即可。

MySQL之数据类型建表以及约束

SELECT(查询) 查询操作用于从数据库中检索数据 查询可以基于不同的条件&#xff0c;如字段值、范围、排序等 查询结果可以返回单个记录或多个记录 查询指定列 select 列名 from 表名 列名&#xff1a;代表从指定的列名中查找 , 如果是查找对应的多列&#xff0c;则用英文…

uniapp知识大杂烩?

UniApp是一个基于Vue.js框架的跨平台开发框架&#xff0c;可以用于同时开发iOS、Android和Web应用程序。下面是一些UniApp的知识点大杂烩&#xff1a; 跨平台开发&#xff1a;UniApp采用了一套代码多端运行的原则&#xff0c;可以使用一种语言&#xff08;通常是Vue.js&#xf…

【鸿蒙4.0】安装DevEcoStudio

1.下载安装包 HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者华为鸿蒙DevEco Studio是面向全场景的一站式集成开发环境,&#xff0c;在鸿蒙官网下载或升级操作系统开发工具DevEco Studio最新版本&#xff0c;SDK配置和下载&#xff0c;2.1支持Mac、Windows操作系统。…

华为MDC610接口说明

1、MDC610对外功能接口 2、1、MDC610硬件技术规格

新火种AI|三星打响“AI手机”第一枪,2024会是AI终端元年吗?

作者&#xff1a;文子 编辑&#xff1a;小迪 AI手机&#xff0c;距离取代传统手机不远了。 三星新年第一炸&#xff0c;AI手机重磅来袭 2024年才刚刚开始&#xff0c;手机行业就迎来第一个王炸。 作为常年盘踞销量全球前三的品牌&#xff0c;三星突然宣布&#xff0c;将在北…

智慧工厂:科技与制造融合创新之路

随着科技的迅猛发展&#xff0c;智慧工厂成为制造业领域的热门话题。智慧工厂利用先进的技术和智能化系统&#xff0c;以提高生产效率、降低成本、增强产品质量和灵活性为目标&#xff0c;正在引领着未来制造业的发展。 智慧工厂的核心是数字化和自动化生产&#xff0c;相较于传…

(rhel8)man rpm个人学习笔记

1.一些自己原先不懂的英文英文单词简介 单词 释义exampleverify验证、核实、证实、核对select选择、选取select-optionsencapsulate概括、压缩、简述... used to encapsulate software to be install,and source packages,...recipe配方、方法same as belownecesssary必要的co…

Kettle Local引擎使用记录(基于Kettle web版数据集成开源工具data-integration源码)

Kettle Web &#x1f4da;第一章 前言&#x1f4da;第二章 demo源码&#x1f4d7;pom.xml引入Kettle引擎核心文件&#x1f4d7;java源码&#x1f4d5; controller&#x1f4d5; service&#x1f4d5; 其它&#x1f4d5; maven settings.xml &#x1f4d7;测试&#x1f4d5; 测试…

6-Docker Compose-同时管理mysql和tomcat application

1.创建docker-compose.yml文件,添加如下内容并保存 vim docker-compose.yml [root@centos79 ~]# cat docker-compose.yml #yml文件 version: 3 services:mysql-ztj:restart: alwaysimage: daocloud.io/library/mysql:5.7.4container_name: mysql-ztjports:- 3306:3306envir…

梦想家内容管理系统(Dreamer CMS)跨站请求伪造漏洞

梦想家内容管理系统&#xff08;Dreamer CMS&#xff09;跨站请求伪造漏洞 目标:GitHub - iteachyou-wjn/dreamer_cms: Dreamer CMS 梦想家内容发布系统采用流行的SpringBoot搭建&#xff0c;支持静态化、标签化建站。不需要专业的后台开发技能&#xff0c;会HTML就能建站&…

SLAM ORB-SLAM2(15)单应矩阵的计算和评分

SLAM ORB-SLAM2(15)单应矩阵的计算和评分 1. 前言2. 单应矩阵2.1. 概念2.2. 推导2.3. 计算原理3. ComputeH213. CheckHomography1. 前言 在 《SLAM ORB-SLAM2(13)查找单应矩阵》 中了解到 查找单应矩阵主要过程: 特征点坐标归一化 Normalize函数 Normalize 参考 《SLAM O…

华为HCIE课堂笔记第十一章 IPv6概述

第十一章 IPv6概述 11.1 背景 根本原因是&#xff1a;IPv4地址枯竭&#xff0c;IPv6是IPV4的升级版本 11.1.1 IPv6地址的优势&#xff1a; 地址空间足够大 128bit支持即插即用底层化地址结构&#xff1a;地址分配有一定的标准相比于IPv4简化了报文的头部&#xff0c;提高了…

关于CNN卷积神经网络与Conv2D标准卷积的重要概念

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 深入解读卷积网络的工作原理&#xff08;附实现代码&#xff09; 深入解读反卷积网络&#xff08;附实现代码&#xff09; Wavelet U-net进行微光图像处理 卷积知识点 CNN网络的设计论&#xff1a;NAS vs Handcra…

解决Gitee每次push都需要输入用户名和密码

其实很简单&#xff0c;只需要使用命令 git config --global credential.helper store 在你下次push时只需要再输入一次用户名和密码&#xff0c;电脑就会保存下来&#xff0c;之后就无需进行输入了。

OpenHarmony底座升级指南(3.2升级4.0)

前言 本文旨在帮助开发者完成底座升级&#xff0c;文中主要以OpenHarmony 3.2 release 升级至OpenHarmony 4.0 release为模板描述。 一、流程概览&#xff1a; 1.1 准备工作 在准备阶段&#xff0c;需要完整收集所有的定制化修改&#xff0c;明确修改人&#xff1b;并且要将…

嵌入式项目——平衡小车(1)

焊接 驱动板需要焊接的如上图。 陀螺仪8pin排母电机两路排线插口。(个别同学需要焊接)两个电池仓,注意电池仓分正反。 安装 底部电池板 4个 双通尼龙柱M3*224个 尼龙螺钉M3*6电机驱动板

【算法笔记】深入理解dfs(两道dp题)

DFS过程的概述 一个一个节点的搜&#xff0c;如果是树状结构的话&#xff0c;先找到最左边那一条分支搜到最后一个节点&#xff0c;这个时候最后一个节点&#xff08;假设是b&#xff09;的数据会被更新&#xff08;具体看题目的要求&#xff09;&#xff0c;然后返回到上一个…