当前位置: 首页 > news >正文

深入探索 MySQL 8 中的 JSON 类型:功能与应用

随着 NoSQL 数据库的兴起,JSON 作为一种轻量级的数据交换格式受到了广泛的关注。为了满足现代应用程序的需求,MySQL 8引入了原生的 JSON 数据类型,提供了一系列强大的 JSON 函数来处理和查询 JSON 数据。本文将深入探讨 MySQL 8 中JSON 类型的特性、函数、索引以及实际应用场景。

1. 引言

在早期的 MySQL 版本中,开发者通常将 JSON 数据以字符串的形式存储在数据库中,这导致了查询效率低下和数据处理复杂。为了解决这个问题,MySQL 8 引入了原生的 JSON 数据类型,允许开发者以结构化的方式存储和查询 JSON 数据。

2. JSON 数据类型特性

  • 验证:当插入或更新 JSON 列时,MySQL 会自动验证数据的 JSON 格式,确保数据的完整性。
  • 优化存储:JSON 数据类型以二进制格式存储,相比纯文本存储更加高效。
  • 灵活性:JSON 列可以存储数组、对象、嵌套结构等,为数据的表示提供了极大的灵活性。

3. JSON 函数

MySQL 8 提供了一系列内置函数来操作和查询 JSON 数据:

  • 提取数据:使用 JSON_EXTRACT() 函数可以从 JSON 文档中提取指定的数据片段。
  • 修改数据:JSON_INSERT()、JSON_REPLACE() 和 JSON_REMOVE() 函数允许你向 JSON 文档中添加、替换或删除数据。
  • 创建 JSON:JSON_ARRAY() 和 JSON_OBJECT() 函数用于创建 JSON 数组和对象。
  • 查询功能:JSON_LENGTH()、JSON_KEYS()、JSON_VALID() 等函数,用于获取 JSON 数据的长度、键或验证 JSON 数据的有效性。
  • 其他函数,如 JSON_QUOTE(), JSON_UNQUOTE(), JSON_CONTAINS(), JSON_CONTAINS_PATH(), JSON_ARRAY_APPEND(), JSON_ARRAY_INSERT() 等等。

下面的例子看看每个函数的具体使用方法:
首先,我们创建一个名为 json_example 的表,并插入一条 JSON 数据:

CREATE TABLE json_example (  id INT AUTO_INCREMENT PRIMARY KEY,  data JSON  
);  INSERT INTO json_example (data) VALUES (  '{  "name": "John Doe",  "age": 30,  "address": {  "street": "123 Main St",  "city": "Anytown",  "zip": "12345"  },  "phoneNumbers": ["123-456-7890", "987-654-3210"],  "isActive": true  }'  
);

表 json_example 中有一条包含 JSON 数据的记录。接下来,我们将使用不同的 JSON 函数来查询和修改这个数据.

3.1 JSON_EXTRACT()

  • 提取 JSON 数据中的特定部分
-- 提取 name 字段的值  
SELECT JSON_EXTRACT(data, '$.name') AS extracted_name FROM json_example;  
-- 结果: "John Doe"  -- 提取 address 对象的 city 字段的值  
SELECT JSON_EXTRACT(data, '$.address.city') AS city FROM json_example;  
-- 结果: "Anytown"

3.2 JSON_INSERT()

  • 向 JSON 数据中插入新的部分,如果路径已存在则不会替换。
-- 在 phoneNumbers 数组后面插入一个新的电话号码  
UPDATE json_example  
SET data = JSON_INSERT(data, '$.phoneNumbers[2]', '555-123-4567');  
-- 此时 phoneNumbers 变为 ["123-456-7890", "987-654-3210", "555-123-4567"]

3.3 JSON_REPLACE()

  • 替换 JSON 数据中的部分,如果路径不存在则不会添加。
-- 替换 name 字段的值  
UPDATE json_example  
SET data = JSON_REPLACE(data, '$.name', 'Jane Smith');  
-- 此时 name 变为 "Jane Smith"

3.4 JSON_REMOVE()

  • 从 JSON 数据中移除指定的部分。
-- 移除 phoneNumbers 数组中的第一个电话号码  
UPDATE json_example  
SET data = JSON_REMOVE(data, '$.phoneNumbers[0]');  
-- 此时 phoneNumbers 变为 ["987-654-3210", "555-123-4567"]

3.5 JSON_ARRAY() 和 JSON_OBJECT()

  • 创建 JSON 数组和对象
-- 创建一个新的 JSON 数组  
SELECT JSON_ARRAY('a', 1, TRUE);  
-- 结果: ["a", 1, true]  -- 创建一个新的 JSON 对象  
SELECT JSON_OBJECT('key1', 'value1', 'key2', 2);  
-- 结果: {"key1": "value1", "key2": 2}
JSON_LENGTH() - 获取 JSON 文档或数组的长度。
sql
-- 获取 phoneNumbers 数组的长度  
SELECT JSON_LENGTH(data->'$.phoneNumbers') AS phone_numbers_length FROM json_example;  
-- 结果: 2 (因为 phoneNumbers 数组现在有两个元素)

3.6 JSON_KEYS()

  • 获取 JSON 对象的所有键
-- 获取 JSON 对象的所有键  
SELECT JSON_KEYS(data) AS object_keys FROM json_example;  
-- 结果: ["name", "age", "address", "phoneNumbers", "isActive"]

3.7 JSON_VALID()

  • 验证 JSON 数据的有效性。
-- 验证 data 列是否包含有效的 JSON  
SELECT JSON_VALID(data) AS is_valid_json FROM json_example;  
-- 结果: 1 (表示 true,因为 data 列包含有效的 JSON)

3.8 JSON_QUOTE() 和 JSON_UNQUOTE()

  • 将字符串转换为 JSON 格式的字符串,以及反向操作。

假设json_example 表中存在这样一条数据

INSERT INTO json_example (data) VALUES (  '{  "name": "John",  "interests": ["reading", "music"],  "friends": [  {"name": "Alice", "age": 28},  {"name": "Bob", "age": 32}  ]  }'  
);

现在我们将使用上述函数对这条数据进行操作:

-- 使用 JSON_QUOTE 将普通字符串转换为 JSON 字符串  
SELECT JSON_QUOTE('Hello, World!') AS quoted_string;  
-- 结果: ""Hello, World!""  -- 使用 JSON_UNQUOTE 将 JSON 字符串转换回普通字符串  
SELECT JSON_UNQUOTE('"Hello, World!"') AS unquoted_string;  
-- 结果: Hello, World!

请注意,在实际的数据列上使用这些函数时,你通常会对已存储的 JSON 值或要插入的值进行操作。

3.9 JSON_CONTAINS()

  • 检查 JSON 文档是否包含指定的值。
-- 检查 interests 数组是否包含 "reading"  
SELECT JSON_CONTAINS(data->'$.interests', '"reading"') AS contains_reading FROM json_example;  
-- 结果: 1 (表示 true,因为 interests 数组包含 "reading")

注意,因为 JSON 中的字符串是被双引号包围的,所以我们在查询时也需要对搜索的字符串值加上双引号。

3.9 JSON_CONTAINS_PATH()

  • 检查 JSON 文档是否包含指定的路径。
-- 检查是否存在 friends 数组中的对象的 name 路径  
SELECT JSON_CONTAINS_PATH(data, 'one', '$.friends[*].name') AS contains_path FROM json_example;  
-- 结果: 1 (表示 true,因为存在该路径)

3.10 JSON_ARRAY_APPEND()

  • 向 JSON 数组追加元素。
-- 向 interests 数组追加 "traveling"  
UPDATE json_example  
SET data = JSON_SET(data, '$.interests[2]', 'traveling');  
-- 注意:这里使用了 JSON_SET,因为 JSON_ARRAY_APPEND 需要指定路径到具体数组  
-- 在 MySQL 8.0.17 及更高版本中,可以使用 JSON_ARRAY_APPEND 正确地追加元素  
-- 例如: JSON_ARRAY_APPEND(data, '$.interests', 'traveling')

注意:上面的例子中使用了 JSON_SET 而不是 JSON_ARRAY_APPEND,因为在 MySQL 8.0.17 之前,JSON_ARRAY_APPEND 的语法有些不同,它要求指定路径到一个具体的数组元素。从 8.0.17 开始,JSON_ARRAY_APPEND 可以正确地追加到数组末尾。
正确的 JSON_ARRAY_APPEND 用法如下:

-- 向 interests 数组追加 "traveling"(适用于 MySQL 8.0.17 及更高版本)  
UPDATE json_example  
SET data = JSON_ARRAY_APPEND(data, '$.interests', 'traveling');

3.11 JSON_ARRAY_INSERT()

  • 在 JSON 数组的指定位置插入元素。
-- 在 interests 数组的第一个位置插入 "gaming"  
UPDATE json_example  
SET data = JSON_ARRAY_INSERT(data, '$.interests[0]', 'gaming');  
-- 结果: interests 数组现在是 ["gaming", "reading", "music", "traveling"]

4. JSON 索引

为了提高查询性能,MySQL 8 支持为 JSON 列创建索引。但由于 JSON 数据的灵活性,直接对整个 JSON 文档创建索引并不高效。因此,MySQL 引入了虚拟列(Virtual Columns)的概念。

  • 虚拟列:虚拟列允许你根据 JSON 列中的值生成一个新的列,并为这个新列创建索引。这样,当你根据 JSON 数据中的某个字段进行查询时,MySQL 可以使用索引来加速查询。(关于虚拟列我将在之后的文章详解)
  • 创建索引:通过结合使用 JSON_EXTRACT() 函数和虚拟列,你可以轻松地为 JSON 数据中的特定字段创建索引。

基于上面的json_example 表,我们来看下为json字段创建索引

4.1 添加虚拟列:

我们将添加一个名为 first_interest 的虚拟列,该列将存储 interests 数组的第一个元素。

ALTER TABLE json_example  
ADD first_interest VARCHAR(255) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(data, '$.interests[0]'))) VIRTUAL;

在这里,我们使用了 JSON_EXTRACT() 来获取 interests 数组的第一个元素,并用 JSON_UNQUOTE() 去除引号,因为 JSON_EXTRACT() 返回的是 JSON 格式的字符串。

4.2 为虚拟列创建索引:

CREATE INDEX idx_first_interest ON json_example(first_interest);

现在,我们为 first_interest 列创建了一个索引,这将加速基于该列的查询。

4.3 查询优化:

现在,我们可以基于 first_interest 列进行查询,并利用索引来加速查询过程。

SELECT * FROM json_example WHERE first_interest = 'reading';

由于我们为 first_interest 创建了索引,这个查询将会更加高效。但是,请注意,这种方法仅适用于查询 interests 数组的第一个元素。如果你需要查询数组中的其他元素,你可能需要采用其他策略,比如使用全文搜索、倒排索引或者将 JSON 数据规范化到关系型结构中。

5. 实际应用场景

  • 配置文件存储:应用程序的配置信息通常以 JSON 格式表示。使用 MySQL 8 的 JSON 数据类型,你可以轻松地将这些配置信息存储在数据库中,并使用 JSON 函数进行查询和修改。
  • 日志记录:日志条目通常以结构化的格式存储,JSON 是一个理想的选择。通过将日志数据存储在 JSON 列中,你可以轻松地分析和查询日志数据。
  • 与前端集成:使用 JSON 与后端进行数据交换。使用 MySQL 8 的 JSON 支持,你可以简化数据库与前端之间的数据交互。

6. 注意事项

  • 性能:虽然 MySQL 8 提供了对 JSON 的支持,但与传统的关系型数据相比,JSON 查询可能仍然不够高效。
  • 数据验证:虽然 MySQL 会验证 JSON 数据的格式,但它不会验证数据的业务规则或完整性。
  • 复杂性:JSON 数据的结构可能比传统的关系型数据更复杂,这可能会增加查询和维护的难度。

7. 结论

MySQL 8 的 JSON 数据类型为存储和查询 JSON 数据提供了强大的支持。通过内置的 JSON 函数和虚拟列索引,开发者可以高效地处理 JSON 数据,满足现代应用程序的需求。如果你正在开发需要存储和查询 JSON 数据的应用程序,不妨考虑使用 MySQL 8 的 JSON 功能来简化你的工作。

相关文章:

深入探索 MySQL 8 中的 JSON 类型:功能与应用

随着 NoSQL 数据库的兴起,JSON 作为一种轻量级的数据交换格式受到了广泛的关注。为了满足现代应用程序的需求,MySQL 8引入了原生的 JSON 数据类型,提供了一系列强大的 JSON 函数来处理和查询 JSON 数据。本文将深入探讨 MySQL 8 中JSON 类型的…...

学习Spring的第十三天

非自定义bean注解开发 设置非自定义bean : 用bean去修饰一个方法 , 最后去返回 , spring就把返回的这个对象,放到Spring容器 一 :名字 : 如果bean配置了参数 , 名字就是参数名 , 如果没有 , 就是方法名字 二 : 如果方法产生对象时 , 需要注入数据 , 在方法参数设置即可 , …...

jss/css/html 相关的技术栈有哪些?

js 的技术组件有哪些?比如 jQuery vue 等 常见的JavaScript技术组件: jQuery: jQuery是一个快速、小巧且功能丰富的JavaScript库,用于简化DOM操作、事件处理、动画效果等任务。 React: React是由Facebook开发的用于构…...

机器学习超参数优化算法(贝叶斯优化)

文章目录 贝叶斯优化算法原理贝叶斯优化的实现(三种方法均有代码实现)基于Bayes_opt实现GP优化基于HyperOpt实现TPE优化基于Optuna实现多种贝叶斯优化 贝叶斯优化算法原理 在贝叶斯优化的数学过程当中,我们主要执行以下几个步骤: …...

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(六)

原文:Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者:飞龙 协议:CC BY-NC-SA 4.0 第十四章:使用卷积神经网络进行深度计算机视觉 尽管 IBM 的 Deep Blue 超级计算机在 1996 年击败了国际象棋世界冠军…...

XGB-3: 模型IO

在XGBoost 1.0.0中,引入了对使用JSON保存/加载XGBoost模型和相关超参数的支持,旨在用一个可以轻松重用的开放格式取代旧的二进制内部格式。后来在XGBoost 1.6.0中,还添加了对通用二进制JSON的额外支持,作为更高效的模型IO的优化。…...

springboot(ssm船舶维保管理系统 船只报修管理系统Java系统

springboot(ssm船舶维保管理系统 船只报修管理系统Java系统 开发语言:Java 框架:springboot(可改ssm) vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7&a…...

机器学习本科课程 大作业 多元时间序列预测

1. 问题描述 1.1 阐述问题 对某电力部门的二氧化碳排放量进行回归预测,有如下要求 数据时间跨度从1973年1月到2021年12月,按月份记录。数据集包括“煤电”,“天然气”,“馏分燃料”等共9个指标的数据(其中早期的部分…...

[office] excel中weekday函数的使用方法 #学习方法#微信#媒体

excel中weekday函数的使用方法 在EXCEL中Weekday是一个日期函数,可以计算出特定日期所对应的星期数。下面给大家介绍下Weekday函数作用方法。 01、比如,我在A84单元格输入一个日期,2018/5/9;那么,我们利用weekday计算…...

PAT-Apat甲级题1007(python和c++实现)

PTA | 1007 Maximum Subsequence Sum 1007 Maximum Subsequence Sum 作者 CHEN, Yue 单位 浙江大学 Given a sequence of K integers { N1​, N2​, ..., NK​ }. A continuous subsequence is defined to be { Ni​, Ni1​, ..., Nj​ } where 1≤i≤j≤K. The Maximum Su…...

洛谷:P2957 [USACO09OCT] Barn Echoes G

题目描述 The cows enjoy mooing at the barn because their moos echo back, although sometimes not completely. Bessie, ever the excellent secretary, has been recording the exact wording of the moo as it goes out and returns. She is curious as to just how mu…...

flinksqlbug : AggregateFunction udf Could not extract a data type from

org.apache.flink.table.api.ValidationException: SQL validation failed. An error occurred in the type inference logic of function ‘default_catalog.default_database.CollectSetSort’. org.apache.flink.table.api.ValidationException: An error occurred in the t…...

Aigtek高压放大器用途是什么呢

高压放大器在电子领域中扮演着至关重要的角色,其主要作用是将低电压信号放大到更高的电压水平。这种类型的放大器广泛用于各种应用中,以下是高压放大器的用途以及其关键作用的详细介绍。 1、科学研究和实验室应用: 高压放大器在科学研究和实验…...

c++ STL less 的视角

c less 函数在不同的地方感觉所起的作用是不一样的, 这中间原因是 less 的视角不一样, 下面尝试给出解释下, 方便记忆 1、 左右视角 符合 排序sort less(value, element) less 表示一种 “符合关系“, 表示sort 后…...

MQ面试题整理(持续更新)

1. MQ的优缺点 优点:解耦,异步,削峰 缺点: 系统可用性降低 系统引入的外部依赖越多,越容易挂掉。万一 MQ 挂了,MQ 一挂,整套系统崩 溃,你不就完了?系统复杂度提高 硬生…...

2401cmake,学习cmake2

步4:安装与测试 现在开始给项目添加安装规则和支持测试. 安装规则 安装规则非常简单:对MathFunctions,想安装库和头文件,对应用,想安装可执行文件和配置头. 所以在MathFunctions/CMakeLists.txt尾添加: install(TARGETS MathFunctions DESTINATION lib) install(FILES Mat…...

理解Jetpack Compose中的`remember`和`mutableStateOf`

理解Jetpack Compose中的remember和mutableStateOf 在现代Android开发中,Jetpack Compose已经成为构建原生UI的首选工具。它引入了一种声明式的编程模式,极大地简化了UI开发。在Compose的世界里,remember和mutableStateOf是两个非常关键的函…...

3D力导向树插件-3d-force-graph学习002

一、实现效果:节点文字同时展示 节点显示不同颜色节点盒label文字并存节点上添加点击事件 二、利用插件:CSS2DRenderer 提示:以下引入文件均可在安装完3d-force-graph的安装包里找到 三、关键代码 提示:模拟数据可按如下格式填…...

QXlsx Qt操作excel

QXlsx 是一个用于处理Excel文件的开源C库。它允许你在你的C应用程序中读取和写入Microsoft Excel文件(.xlsx格式)。该库支持多种操作,包括创建新的工作簿、读取和写入单元格数据、格式化单元格、以及其他与Excel文件相关的功能。 支持跨平台…...

Node.js 包管理工具

一、概念介绍 1.1 包是什么 『包』英文单词是 package ,代表了一组特定功能的源码集合 1.2 包管理工具 管理『包』的应用软件,可以对「包」进行 下载安装 , 更新 , 删除 , 上传 等操作。 借助包管理工具&#xff0…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘&#xf…...