【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大小,动画效果做了加速,效果如下: <!DOCTYPE html> <html> <head> <style> *{padding:0;margin:0;}/*清除默认填充及边距*/.water{position:relative;width:100vw;height:100vh;overflow:hidden;background…...
SQL二次注入
目录 1.什么是二次注入? 2.二次注入过程 2.1寻找注入点 2.2注册admin#用户 2.3修改密码 1.什么是二次注入? 当用户提交的恶意数据被存入数据库后,因为被过滤函数过滤掉了,所以无法生效,但应用程序在从数据库中拿…...
深入学习小程序开发第二天:数据绑定与动态更新
一、概念 在小程序中,数据绑定是指将页面的数据和视图进行关联,使得数据的变化能够自动反映在视图上,而不需要手动操作DOM。这种绑定是双向的,即数据改变时视图更新,视图操作(如用户输入)也能改变数据。 二、用法 1.单向数据绑定与双向数据绑定: 在小程序中,数据绑定…...
【ai】 时间序列分析的python例子
时间序列分析 :分析和理解随时间变化的数据序列 在gcc的趋势滤波后,需要对排队延迟梯度进行检测及调整,参考的是一个阈值, 调整阈值时就使用了时间序列分析技术: 时间序列分析是统计学和数据分析中的一种技术,用于分析和理解随时间变化的数据序列。时间序列数据具有时间上…...
生成订单幂等性(防止订单重复提交)
订单唯一性(防止重复下单)方案 重复下单产生原因: 客户端原因: 比如下单的按键在点按之后,在没有收到服务器请求之前,按键的状态没有设为已禁用状态,还可以被按。又或者,在触摸屏下,用户手指…...
IDEA自定义注释模版
1.类(接口/枚举等同理) 2.方法模版 先自定义一个模版组,然后在里面添加模版名,触发快捷键(Tab/Enter),模版描述,哪些语言中应用 模版中的自定义参数params和returns可以自动展开参数…...
Spring Cloud Gateway实现API访问频率限制
Spring Cloud Gateway实现API访问频率限制 一、为什么需要访问频率限制?二、使用全局过滤器实现访问频率限制步骤:示例代码: 三、使用特定路由的过滤器实现访问频率限制步骤:示例代码: 四、总结 在微服务架构中&#x…...
单例模式:确保唯一实例的设计模式
前言 在学习框架和大型项目开发时,我们常常会遇到“单例模式”这个词。虽然它时常被提及,但往往没有详细讲解。为了搞懂单例模式的真正意义以及它在开发中的应用,我查阅了一些资料并总结了这篇博客。希望通过这篇文章,能够帮助大…...
MCU调试技巧-串口打印
1. 软件仿真printf 条件:MDK 效果:在软件仿真模式下,调试页面的串口终端中可以看到串口打印 教程:https://blog.csdn.net/ybhuangfugui/article/details/94378195 2. 串口重定向printf 条件:物理串口接线 效果&…...
VS+Qt+C++点云PCL三维显示编辑系统
程序示例精选 VSQtC点云PCL三维显示编辑系统 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《VSQtC点云PCL三维显示编辑系统》编写代码,代码整洁,规则,易…...
代码随想录算法训练营第七天(一)| 454.四数相加II 383. 赎金信
454.四数相加II 题目: 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1࿱…...
SpringBoot+Mybatis 分页
无论多数据源,还是单数据源,分页都一样,刚开始出了点错,是因为PageHelper的版本问题 这里用的SpringBoot3 SpringBoot2应该是没有问题的 相关代码 dynamic-datasourceMybatis多数据源使用-CSDN博客 依赖 <?xml version"1.0" encoding"UTF-8"?&g…...
学习进行到了第十七天(2024.8.5)
1.Mybatis的定义 数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。MyBatis 支持定制化 SQL、存储过程以及高级映射,可以…...
【Nuxt】Layout 布局和渲染模式
NuxtLayout app.vue <NuxtLayout><NuxtPage/></NuxtLayout>然后默认的布局 需要 写在 ~/layouts/default.vue 下面,其他自定义的布局也在写在 layouts 目录下。 default.vue <template><div class"app-container"><d…...
C:指针学习(1)-学习笔记
目录 前言: 知识回顾: 1、const 1.1 const修饰普通变量 1.2 const修饰指针变量 1.3 总结: 2、指针运算 2.1 指针-整数 2.2 指针-指针 2.3 指针的关系运算 3、指针的使用 结语: 前言: 距离上一次更新关于初…...
【LVS】负载均衡之NAT模式
一、LVS概念 LVS(Linux Virtual Server)是一个基于Linux操作系统的虚拟服务器技术,用于实现负载均衡和高可用性。LVS通过将客户端的请求分发到多台后端服务器上,从而提高整体服务的处理能力和可靠性。 二、LVS优势 高性能&…...
ASP.NET Core 基础 - 入门实例
一. 下载 1. 下载vs2022 Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 学生,个人开发者选择社区版就行,免费的. 安装程序一直下一步下一步就行,别忘了选择安装位置,如果都放在C盘的话,就太大了. 2. 选择工作负荷 准备工作完成 二. 创建新项目 三…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
