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

【MySQL】MySQL的JSON特性

引言

MySQL从5.7版本开始引入了JSON数据类型,并在8.0版本中大大增强了JSON的支持,包括函数和索引功能。JSON数据类型允许你在MySQL表中存储JSON文档,这些文档可以是对象或数组,并且你可以使用SQL查询来检索、搜索、更新和修改这些JSON文档的内容。

MySQL的JSON特性

数据类型和存储

  • MySQL中的JSON类型可以存储JSON格式的字符串,这些字符串在内部被解析为JSON文档,允许你使用专门的JSON函数来操作它们。
  • JSON类型的数据以二进制格式存储,因此比纯文本格式更高效。

JSON函数

  • MySQL提供了大量的JSON函数,允许你创建JSON文档、修改JSON文档、提取JSON文档中的值等。
  • 常用的JSON函数包括JSON_ARRAY()JSON_OBJECT()JSON_SET()JSON_REPLACE()JSON_EXTRACT()JSON_CONTAINS()JSON_LENGTH()JSON_KEYS()JSON_VALUES()

索引

  • MySQL 5.7及以上版本支持在JSON文档上创建虚拟列索引,这允许你根据JSON文档中的值来优化查询。
  • MySQL 8.0引入了JSON路径表达式索引,这进一步增强了在JSON文档上执行高效查询的能力。

路径表达式: 

  • JSON路径表达式(JSONPath)用于指定JSON文档中的元素或子文档。在MySQL中,你可以使用JSONPath来提取、修改或查询JSON文档中的数据。

 例子

假设我们有一个名为users的表,它有一个名为info的JSON列,用于存储用户的额外信息(如姓名、年龄、兴趣爱好等)。

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),info JSON
);INSERT INTO users (name, info) VALUES
('Alice', '{"age": 30, "hobbies": ["reading", "traveling"]}'),
('Bob', '{"age": 25, "hobbies": ["swimming", "gaming"]}');

提取JSON数据

-- 提取Alice的年龄
SELECT JSON_EXTRACT(info, '$.age') AS age FROM users WHERE name = 'Alice';-- 或者使用更简洁的语法(MySQL 5.7.9+)
SELECT info->>"$.age" AS age FROM users WHERE name = 'Alice';-- 提取Bob的第一个爱好
SELECT JSON_EXTRACT(info, '$.hobbies[0]') AS first_hobby FROM users WHERE name = 'Bob';-- 或者
SELECT info->>"$.hobbies[0]" AS first_hobby FROM users WHERE name = 'Bob';

修改JSON数据

- 给Alice添加一个新的爱好"cooking"
UPDATE users
SET info = JSON_SET(info, '$.hobbies', JSON_ARRAY_APPEND(info->'$.hobbies', 'cooking'))
WHERE name = 'Alice';-- 或者,如果你知道Alice的爱好数组是什么,可以直接使用JSON_REPLACE或JSON_INSERT(如果爱好不存在的话)
UPDATE users
SET info = JSON_INSERT(info, '$.hobbies[2]', 'cooking')
WHERE name = 'Alice' AND JSON_CONTAINS(info->'$.hobbies', '"cooking"', '$') = 0;

注意:上面的JSON_SET示例可能不是添加新元素到数组的最直接方式,因为JSON_SET会替换整个数组。对于数组,你可能想使用JSON_ARRAY_APPEND或类似的函数。然而,JSON_ARRAY_APPEND不直接支持路径表达式作为目标,因此你可能需要先将数组提取出来,修改它,然后再设置回去。

使用虚拟列(Generated Columns)和索引(MySQL 5.7+)

在MySQL 5.7及以上版本中,你可以使用虚拟列(也称为生成列)来存储JSON文档中某个字段的值,并在这个虚拟列上创建索引。

-- 假设你有一个users表和一个info JSON列
ALTER TABLE users
ADD COLUMN age INT AS (JSON_UNQUOTE(JSON_EXTRACT(info, '$.age'))) STORED;-- 然后在这个虚拟列上创建索引
CREATE INDEX idx_age ON users(age);

注意,这里使用了STORED关键字,这意味着MySQL会物理地存储这个虚拟列的值,并可以在其上创建索引。如果你使用VIRTUAL(MySQL 5.7.6+),则MySQL不会在磁盘上存储这个列的值,但它仍然可以在查询优化期间使用它(但不能直接在其上创建索引)。

JSON特性常用函数

JSON_EXTRACT()

  •  提取 JSON 数据中的特定部分

JSON_INSERT()

  • 向 JSON 数据中插入新的部分,如果路径已存在则不会替换。

JSON_REPLACE() 

  • 替换 JSON 数据中的部分,如果路径不存在则不会添加。

JSON_REMOVE() 

  • 从 JSON 数据中移除指定的部分。

JSON_ARRAY() 和 JSON_OBJECT() 

  • 创建 JSON 数组和对象

JSON_KEYS() 

  • 获取 JSON 对象的所有键

 JSON_VALID()

  • 验证 JSON 数据的有效性。

JSON_QUOTE() 和 JSON_UNQUOTE() 

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

JSON_CONTAINS() 

  • 检查 JSON 文档是否包含指定的值。

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

JSON_CONTAINS_PATH() 

  • 检查 JSON 文档是否包含指定的路径。

JSON_ARRAY_APPEND() 

  • 向 JSON 数组追加元素。

 

 

 

 

 

 

 

 

 

相关文章:

【MySQL】MySQL的JSON特性

引言 MySQL从5.7版本开始引入了JSON数据类型,并在8.0版本中大大增强了JSON的支持,包括函数和索引功能。JSON数据类型允许你在MySQL表中存储JSON文档,这些文档可以是对象或数组,并且你可以使用SQL查询来检索、搜索、更新和修改这些…...

微信小程序 - 自定义计数器 - 优化(键盘输入校验)

微信小程序通过自定义组件,实现计数器值的增加、减少、清零、最大最小值限定、禁用等操作。通过按钮事件触发方式,更新计数器的值,并修改相关联的其它变量。通过提升用户体验,对计数器进行优化设计,使用户操作更加便捷…...

Nacos 容器化安装和代理配置指南

简介 Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。本文将介绍如何使用 Docker 容器化安装 Nacos 以及如何配置 Nacos 的代理。 前提条件 已安装 Docker 和 Docker Compose基本的 Doc…...

css水波浪动画效果

为缩小gif大小&#xff0c;动画效果做了加速&#xff0c;效果如下&#xff1a; <!DOCTYPE html> <html> <head> <style> *{padding:0;margin:0;}/*清除默认填充及边距*/.water{position:relative;width:100vw;height:100vh;overflow:hidden;background…...

SQL二次注入

目录 1.什么是二次注入&#xff1f; 2.二次注入过程 2.1寻找注入点 2.2注册admin#用户 2.3修改密码 1.什么是二次注入&#xff1f; 当用户提交的恶意数据被存入数据库后&#xff0c;因为被过滤函数过滤掉了&#xff0c;所以无法生效&#xff0c;但应用程序在从数据库中拿…...

深入学习小程序开发第二天:数据绑定与动态更新

一、概念 在小程序中,数据绑定是指将页面的数据和视图进行关联,使得数据的变化能够自动反映在视图上,而不需要手动操作DOM。这种绑定是双向的,即数据改变时视图更新,视图操作(如用户输入)也能改变数据。 二、用法 1.单向数据绑定与双向数据绑定: 在小程序中,数据绑定…...

【ai】 时间序列分析的python例子

时间序列分析 :分析和理解随时间变化的数据序列 在gcc的趋势滤波后,需要对排队延迟梯度进行检测及调整,参考的是一个阈值, 调整阈值时就使用了时间序列分析技术: 时间序列分析是统计学和数据分析中的一种技术,用于分析和理解随时间变化的数据序列。时间序列数据具有时间上…...

生成订单幂等性(防止订单重复提交)

订单唯一性(防止重复下单)方案 重复下单产生原因&#xff1a; 客户端原因&#xff1a; 比如下单的按键在点按之后&#xff0c;在没有收到服务器请求之前&#xff0c;按键的状态没有设为已禁用状态&#xff0c;还可以被按。又或者&#xff0c;在触摸屏下&#xff0c;用户手指…...

IDEA自定义注释模版

1.类&#xff08;接口/枚举等同理&#xff09; 2.方法模版 先自定义一个模版组&#xff0c;然后在里面添加模版名&#xff0c;触发快捷键&#xff08;Tab/Enter&#xff09;&#xff0c;模版描述&#xff0c;哪些语言中应用 模版中的自定义参数params和returns可以自动展开参数…...

Spring Cloud Gateway实现API访问频率限制

Spring Cloud Gateway实现API访问频率限制 一、为什么需要访问频率限制&#xff1f;二、使用全局过滤器实现访问频率限制步骤&#xff1a;示例代码&#xff1a; 三、使用特定路由的过滤器实现访问频率限制步骤&#xff1a;示例代码&#xff1a; 四、总结 在微服务架构中&#x…...

单例模式:确保唯一实例的设计模式

前言 在学习框架和大型项目开发时&#xff0c;我们常常会遇到“单例模式”这个词。虽然它时常被提及&#xff0c;但往往没有详细讲解。为了搞懂单例模式的真正意义以及它在开发中的应用&#xff0c;我查阅了一些资料并总结了这篇博客。希望通过这篇文章&#xff0c;能够帮助大…...

MCU调试技巧-串口打印

1. 软件仿真printf 条件&#xff1a;MDK 效果&#xff1a;在软件仿真模式下&#xff0c;调试页面的串口终端中可以看到串口打印 教程&#xff1a;https://blog.csdn.net/ybhuangfugui/article/details/94378195 2. 串口重定向printf 条件&#xff1a;物理串口接线 效果&…...

VS+Qt+C++点云PCL三维显示编辑系统

程序示例精选 VSQtC点云PCL三维显示编辑系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VSQtC点云PCL三维显示编辑系统》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易…...

代码随想录算法训练营第七天(一)| 454.四数相加II 383. 赎金信

454.四数相加II 题目&#xff1a; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1…...

SpringBoot+Mybatis 分页

无论多数据源,还是单数据源,分页都一样,刚开始出了点错,是因为PageHelper的版本问题 这里用的SpringBoot3 SpringBoot2应该是没有问题的 相关代码 dynamic-datasourceMybatis多数据源使用-CSDN博客 依赖 <?xml version"1.0" encoding"UTF-8"?&g…...

学习进行到了第十七天(2024.8.5)

1.Mybatis的定义 数据持久化是将内存中的数据模型转换为存储模型&#xff0c;以及将存储模型转换为内存中数据模型的统称。例如&#xff0c;文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。MyBatis 支持定制化 SQL、存储过程以及高级映射&#xff0c;可以…...

【Nuxt】Layout 布局和渲染模式

NuxtLayout app.vue <NuxtLayout><NuxtPage/></NuxtLayout>然后默认的布局 需要 写在 ~/layouts/default.vue 下面&#xff0c;其他自定义的布局也在写在 layouts 目录下。 default.vue <template><div class"app-container"><d…...

C:指针学习(1)-学习笔记

目录 前言&#xff1a; 知识回顾&#xff1a; 1、const 1.1 const修饰普通变量 1.2 const修饰指针变量 1.3 总结&#xff1a; 2、指针运算 2.1 指针-整数 2.2 指针-指针 2.3 指针的关系运算 3、指针的使用 结语&#xff1a; 前言&#xff1a; 距离上一次更新关于初…...

【LVS】负载均衡之NAT模式

一、LVS概念 LVS&#xff08;Linux Virtual Server&#xff09;是一个基于Linux操作系统的虚拟服务器技术&#xff0c;用于实现负载均衡和高可用性。LVS通过将客户端的请求分发到多台后端服务器上&#xff0c;从而提高整体服务的处理能力和可靠性。 二、LVS优势 高性能&…...

ASP.NET Core 基础 - 入门实例

一. 下载 1. 下载vs2022 Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 学生,个人开发者选择社区版就行,免费的. 安装程序一直下一步下一步就行,别忘了选择安装位置,如果都放在C盘的话,就太大了. 2. 选择工作负荷 准备工作完成 二. 创建新项目 三…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

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

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

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...