【MySQL】MySQL 8 的 JSON 新特性详解(1)JSON 数据类型

news2025/1/16 19:01:01

目录

    • 一、概述
    • 二、MySQL 8 的环境搭建
    • 三、创建数据库、数据表并插入默认数据
    • 四、JSON格式数据的增加和查询
      • 1. 增加一条带JOSN格式的数据
      • 2.查询JSON内数据
      • 3.带筛选条件的查询
    • 五、总结

一、概述

你好,我是小雨青年,一名使用MySQL 8 的程序员。

MySQL 8 引入了对 JSON 数据类型的全面支持,并提供了一组内置函数以有效处理 JSON 数据。MySQL 8 中的 JSON 支持的一些关键特性如下:

  1. JSON 数据类型:MySQL 8 拥有一个名为 JSON 的新数据类型,可用于在列中存储 JSON 数据。该数据类型可以以紧凑和二进制格式存储 JSON 数据,使其比将 JSON 数据存储为字符串更有效。
  2. JSON 函数:MySQL 8 提供了一组内置函数,允许您提取和操纵 JSON 数据。例如,JSON_EXTRACT 函数允许您从 JSON 文档中提取值,JSON_ARRAY 函数允许您创建 JSON 数组,JSON_OBJECT 函数允许您创建 JSON 对象。
  3. JSON 索引:MySQL 8 提供了一个选项,使用 GENERATED 列索引 JSON 数据。这允许您对 JSON 数据执行有效的搜索和排序。
  4. JSON 验证:MySQL 8 提供了一个 JSON_VALID 函数,允许您验证字符串是否为有效的 JSON 文档。
  5. JSON 聚合:MySQL 8 提供了诸如 JSON_ARRAYAGGJSON_OBJECTAGG 等函数,允许您聚合 JSON 数据并将其作为单个 JSON 文档返回。

本文将详细讲解MySQL 8 的JSON 数据类型的使用方法。

二、MySQL 8 的环境搭建

我们使用 Docker 作为本地环境,使用 Docker 具有以下优点:

  1. 简化部署:Docker 容器可以在任何支持 Docker 的系统上部署,并且不会受到底层系统的限制。
  2. 提高可移植性:Docker 容器可以在任何支持 Docker 的环境中运行,并且不需要担心应用程序的依赖关系。
  3. 提高安全性:Docker 容器在运行时独立于其他容器和操作系统,因此可以提高安全性。
  4. 提高可重复性:Docker 容器可以被保存和复制,因此可以提高开发、测试和生产环境之间的可重复性。
  5. 缩短开发周期:Docker 可以加速开发周期,因为它可以快速部署和测试应用程序。
  6. 减少资源消耗:Docker 可以节省系统资源,因为它可以共享操作系统内核,并且可以在同一系统上运行多个容器。
  7. 增强灵活性:Docker 可以根据您的需求轻松更改容器配置,以实现快速迭代和弹性。

在安装 Docker 环境之后,使用docker pull mysql:8拉取镜像到本地。

使用以下命令启动一个名为“mysql-8”的 MySQL 8 容器:

docker run --name mysql8 -e MYSQL_ROOT_PASSWORD=password -p 3310:3306 -d mysql:8

使用以下命令连接到启动的 MySQL 8 容器:

docker exec -it mysql-8 mysql -uroot -ppassword

也可以使用图形化客户端进行连接,在本系列中,我使用的 DBeaver 社区版本,免费开源的数据库图形化客户端。我们在创建连接是注意上面一步配置的端口是3310,下图为连接成功。

image-20230203122822226

三、创建数据库、数据表并插入默认数据

MySQL 8 支持 JSON 数据格式,并且 JSON 数据格式可以在 InnoDB 和 MyISAM 引擎上使用。

InnoDB 是 MySQL 中默认的数据引擎,支持事务、外键约束和其他高级功能。

接下来我们创建数据库,并创建一个带有JSON格式的表,插入数据。

CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

USE mydatabase;

CREATE TABLE mytable (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL,
  phone VARCHAR(255) NOT NULL,
  data JSON,
  UNIQUE KEY email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_General_ci;

INSERT INTO mytable (name, email, phone, data) VALUES 
("John Doe", "johndoe@example.com", "555-555-5555", '{"address": {"city": "San Francisco", "state": "CA"}}'), 
("Jane Doe", "janedoe@example.com", "555-555-5556", '{"address": {"city": "New York", "state": "NY"}}'), 
("Jim Smith", "jimsmith@example.com", "555-555-5557", '{"address": {"city": "Los Angeles", "state": "CA"}}');

创建完成。

image-20230203125548309

四、JSON格式数据的增加和查询

1. 增加一条带JOSN格式的数据

INSERT INTO mytable (name, email, phone, data) VALUES ('John Doe', 'johndoe@example.com', '555-555-5555', '{"address": "123 Main St", "city": "New York", "state": "NY"}');

注意,第四个字段 data 中存储的是一个 JSON 字符串。

2.查询JSON内数据

MySQL 8中查询json类型的数据可以使用->>运算符和->运算符。

->> 运算符可以提取json字段中的文本,而-> 运算符则可以提取json字段中的json对象。

例如,以下是使用 ->> 运算符查询json字段中的文本:

SELECT name, data->>'$.address.city' as city FROM mytable;

查询结果如下所示。

image-20230203180637755

以下是使用 -> 运算符查询json字段中的json对象:

SELECT name, data->'$.address' as city FROM mytable;

查询结果如下所示。

image-20230203180747588

3.带筛选条件的查询

在 MySQL 8 中查询带条件的 JSON 类型数据的方法如下:

使用 JSON 数据路径表达式:

SELECT name, email, phone, data->'$.address' as address, data->>'$.address.city' as city, data->>'$.address.state' 
FROM mytable 
WHERE data->'$.address.state' = 'NY';

查询结果如下所示。

image-20230203181247727

使用 JSON 函数:

SELECT name, email, phone, JSON_EXTRACT(data, '$.address') as address, JSON_EXTRACT(data, '$.address.city') as city, JSON_EXTRACT(data, '$.address.state') as state
FROM mytable 
WHERE JSON_EXTRACT(data, '$.address.state') = 'NY';

查询结果和上面的一致。

五、总结

这次我们介绍了MySQL 8 中对JSON支持的5个关键特性,并对JSON 数据类型的具体使用做了详细介绍。

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

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

相关文章

Hadoop安装(二) --- Hadoop安装

目录 Hadoop安装(一)---JDK安装 修改hadoop313的权限 更改配置文件 配置core-site.xml 配置hadoop-env.sh 配置hdfs-site.xml 配置mapred-site.xml 配置yarn-site.xml 配置环境 刷新当前的shell环境 初始化 启动所有 SH 修改hadoop31…

Android Studio 从安装到第一个Android 应用Demo

安装Android Studio 安装需要 上网 ,我这挺顺利的,就是在官网下载安装包,一路 Next,大概连下载总共半个小时。 第一个应用 参考官方教程:https://developer.android.com/codelabs/basic-android-kotlin-compose-firs…

Redis最佳实践

一、Redis键值设计 1.1、优雅的key结构 Redis的key,最佳实践约定: 遵循基本格式:【业务名称】:【数据名】:【id】长度不超过44字节不包含特殊字符 好处 可读性强避免key冲突方便管理更节省内存 1.2、拒绝BigKey BigKey通常以Key的大小和…

SOLIDWORKS PDM的智能报表自动生成工具

一、SOLIDWORKS企业高级报表软件介绍: SolidKits.Reports(企业高级报表)是一款无缝集成于SOLIDWORKS PDM的智能报表自动生成工具,可以自动生成企业所需的各类报表数据,涵盖结构数据报表、离散数据报表、变更数据报表、…

rocketmq源码-consumer负载均衡逻辑

前言 这篇笔记主要记录consumer在启动过程中,负载均衡的逻辑,多个消费者组成一个消费者组,对于集群模式,同一个消费者组中的多个消费者共同消费一个topic下的所有消息,所以每个consumer可能会处理N个messageQueue&…

【4】KVM管理 | 虚拟机的管理 | 克隆 | 快照

目录 1、虚机基本管理 2、虚机的克隆 3、增量镜像 4、虚机快照 1、虚机基本管理 查看正在运行的虚机 [rootlocalhost ~]# virsh list Id Name State ----------------------------------------------------查看所有的虚机 [rootlocalhost ~…

Apache Oozie(1):Apache Oozie简介

1 Oozie 概述 Oozie 是一个用来管理 Hadoop 生态圈 job 的工作流调度系统。由Cloudera 公司贡献给 Apache。Oozie 是运行于 Java servlet 容器上的一个 java web 应用。Oozie 的目的是按照 DAG(有向无环图)调度一系列的 Map/Reduce或者Hive 等任务。Ooz…

Java SE 进阶(二)之 HashSet底层原理

文章目录前言HashSet底层原理1.哈希表2.哈希值3.底层原理4.回答三个问题前言 关于Set和HashSet的API使用可参见 集合基础入门(Collection,ArrayList,HashSet,HashMap) HashSet底层原理 1.哈希表 HashSet集合底层采…

Vue组件 —— 单文件组件

追溯vue组件问题 在未讲项目之前,在 这一篇内容当中就讲到了组件引入使用,有内置的组件和动态组件以及封装一个swiper组件,组件也分为全局组件和局部组件,在讲在项目当中去使用组件之前先简单的回顾一下组件的编写: &…

89.【SpringBoot-02】

SpringBoot聊一聊如何构建一个网站(十四)、.SpringBoot整合数据库操作1.整合JDBC(1).SpringData简介(2).整合JDBC(3).JdbcTemplate ⭐2. 整合Druid数据源 (德鲁伊)(1).Druid简介(2).配置数据源(3).配置Druid数据源监控(4).配置Druid数据源过滤器(5).注解…

Echarts的Y轴添加定值横线的示例

第010个点击查看专栏目录Echarts折线图的y轴要画一条横线,主要是在series中设置markLine的图表标线参数,具体的参考源代码。文章目录示例效果示例源代码(共142行)相关资料参考专栏介绍示例效果 示例源代码(共142行&…

怎么在Windows电脑更新 DirectX ?

玩游戏的人应该都对DirectX不陌生,它可以提高游戏或多媒体程序的运行效率,增强3d图形和声音效果。但很多人都不知道DirectX该如何更新,这篇文章将以Win10为例,教大家怎么在电脑上更新DirectX。 一、检查当前DirectX版本 如果你不…

简单聊一聊组件封装

封装一个思维导图组件 最近封装了一个简单的思维导图组件,在此简单记录一下心里历程 组件样式 组件结构设计 节点之间的线分成三部分,分别是竖线左边的横线A、竖线B、竖线右边的横线C,所以一个节点可以包含以下几个元素: 横线…

VBA提高篇_18 VBA代码录制优化Select(tion)及表格合并Merge(cells()/Rows()/Columns()

文章目录1. Cells(1,1)2. Rows(Str)和Columns(Str)3. VBA合并单元格3.1 Range.MergeCells属性:3.2 Range.Merge/UnMerage属性:3.3 Range.Merge(参数True/False)3.4 操作合并/取消合并单元格的两种方法4. Select / Selection 和 录制宏的代码优化4.1 Select / Selection4.2 录制…

anconda的pip下载包出现的问题

问题一: 在anconda里面如何创建新的python环境(也就是更换新的python版本) 1.先打开anconda软件,创建需要的环境 2. 环境创建好之后,去pycharm里面进行配置解释器 3. 这样就可以用了 问题二:pip的安装软件时出现包找不到的问题? 注意:因为我们刚刚创建了一个python环境,等…

Python基于已知的分幅条带号筛选出对应遥感影像文件的方法

本文介绍基于Python语言,结合已知研究区域中所覆盖的全部遥感影像的分幅条带号,从大量的遥感影像文件中筛选落在这一研究区域中的遥感影像文件的方法。 首先,先来明确一下本文所需实现的需求。现已知一个研究区域(四川省&#xff…

【C++】C++入门 函数重载

前言 自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。 函数重载一、函数重载定义二、函数重载的条件1. 参数类型不同2. 参数个数不同3. 参数类型顺序不同三、函数重载的原理--名字修饰(name Mangl…

怎么把网页变成灰色?怎么让头像或某一部分不变灰色?filter/backdrop-filter/mix-blend-mode/svg/grayscale(1)

在国家公祭日,我们哀悼沉思,势要勿忘国耻振兴中华;在国家重要人物逝世后,举国哀悼;这些时段很多网站都会积极呼应,给与自己的网页设置成灰色;那给网页设置成灰色是经过怎样的设置来实现的呢&…

利用pandas_udf加速机器学习任务

note pandas udf和python udf区别:前者向量化是在不同partition上处理pandas_udf使用panda API来处理分布式数据集,而toPandas()将分布式数据集转换为本地数据,然后使用pandas进行处理,如果Pyspark的dataframe非常大,…

快速排序和归并排序哪个快?

两个排序的基本思想都是分治(分而治之),实现一般都使用递归实现。1.快速排序双边指针(交换法):记录分界值 ,创建左右指针(记录下标)。以第一个元素为分界值,先从右向左找…