MySQL数据类型之JSON
MySQL数据类型之JSON
SON类型是MySQL 5.7版本新增的数据类型,用好JSON数据类型可以有效解决很多业务中实际问题。
使用JSON数据类型,推荐用MySQL 8.0.17以上的版本,性能更好,同时也支持Multi-Valued Indexes;
JSON数据类型的好处是无须预先定义列,数据本身就具有很好的描述性;
不要将有明显关系型的数据用JSON存储,如用户余额、用户姓名、用户身份证等,这些都是每个用户必须包含的数据;
JSON数据类型推荐使用在不经常更新的静态数据存储。
JSON数据类型
mysql> create table json_user(id int primary key auto_increment, data json);
Query OK, 0 rows affected (0.09 sec)mysql> insert into json_user values(0, '{"name":"morris","age":18,"address":"china"}');
Query OK, 1 row affected (0.03 sec)mysql> insert into json_user values(0, '{"name":"tom","age":16,"mail":"tomcat@google.com"}');
Query OK, 1 row affected (0.01 sec)mysql> select * from json_user;
+----+---------------------------------------------------------+
| id | data |
+----+---------------------------------------------------------+
| 1 | {"age": 18, "name": "morris", "address": "china"} |
| 2 | {"age": 16, "mail": "tomcat@google.com", "name": "tom"} |
+----+---------------------------------------------------------+
2 rows in set (0.01 sec)
常见JSON函数的使用
json_extract抽取字段
mysql> select json_extract('[1, 2, 3, [4, 5]]', '$[1]');
+-------------------------------------------+
| json_extract('[1, 2, 3, [4, 5]]', '$[1]') |
+-------------------------------------------+
| 2 |
+-------------------------------------------+
1 row in set (0.02 sec)mysql> select json_extract('{"age": 18, "name": "morris", "address": "china"}', '$.name');
+-----------------------------------------------------------------------------+
| json_extract('{"age": 18, "name": "morris", "address": "china"}', '$.name') |
+-----------------------------------------------------------------------------+
| "morris" |
+-----------------------------------------------------------------------------+
1 row in set (0.00 sec)mysql> select data->"$.name" from json_user;
+----------------+
| data->"$.name" |
+----------------+
| "morris" |
| "tom" |
+----------------+
2 rows in set (0.00 sec)
json_object将对象转为json
mysql> select json_object('name','bob','age','22','email','bob@sina.com');
+-------------------------------------------------------------+
| json_object('name','bob','age','22','email','bob@sina.com') |
+-------------------------------------------------------------+
| {"age": "22", "name": "bob", "email": "bob@sina.com"} |
+-------------------------------------------------------------+
1 row in set (0.01 sec)
json_insert插入数据
key存在则忽略,不存在则插入。
mysql> select json_insert('{"age": 18, "name": "morris", "address": "china"}', '$.male', 'male', '$.age', 22);
+-------------------------------------------------------------------------------------------------+
| json_insert('{"age": 18, "name": "morris", "address": "china"}', '$.male', 'male', '$.age', 22) |
+-------------------------------------------------------------------------------------------------+
| {"age": 18, "male": "male", "name": "morris", "address": "china"} |
+-------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
json_merge合并数据
json_merge(已不推荐使用)与json_merge_preserve类似,相同的key会合并为数组。
json_merge_patch中相同的key会使用后面的key替换前面的key。
mysql> select json_merge_patch('{"name": "enjoy"}', '{"id": 47, "name":"morris"}');
+----------------------------------------------------------------------+
| json_merge_patch('{"name": "enjoy"}', '{"id": 47, "name":"morris"}') |
+----------------------------------------------------------------------+
| {"id": 47, "name": "morris"} |
+----------------------------------------------------------------------+
1 row in set (0.00 sec)mysql> select json_merge('{"name": "enjoy"}', '{"id": 47, "name":"morris"}');
+----------------------------------------------------------------+
| json_merge('{"name": "enjoy"}', '{"id": 47, "name":"morris"}') |
+----------------------------------------------------------------+
| {"id": 47, "name": ["enjoy", "morris"]} |
+----------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)mysql> select json_merge_preserve('{"name": "enjoy"}', '{"id": 47, "name":"morris"}');
+-------------------------------------------------------------------------+
| json_merge_preserve('{"name": "enjoy"}', '{"id": 47, "name":"morris"}') |
+-------------------------------------------------------------------------+
| {"id": 47, "name": ["enjoy", "morris"]} |
+-------------------------------------------------------------------------+
1 row in set (0.00 sec)
json_array_append后面追加元素
mysql> select json_array_append('["a", "b", "c"]', "$", "x");
+------------------------------------------------+
| json_array_append('["a", "b", "c"]', "$", "x") |
+------------------------------------------------+
| ["a", "b", "c", "x"] |
+------------------------------------------------+
1 row in set (0.00 sec)
json_array_insert里面插入元素
mysql> select json_array_insert('["a", "b", "c"]', "$[1]", "x");
+---------------------------------------------------+
| json_array_insert('["a", "b", "c"]', "$[1]", "x") |
+---------------------------------------------------+
| ["a", "x", "b", "c"] |
+---------------------------------------------------+
1 row in set (0.00 sec)
json_contains包含某个json子串
mysql> select json_contains('{"a":1,"b":4}','{"a":1}');
+------------------------------------------+
| json_contains('{"a":1,"b":4}','{"a":1}') |
+------------------------------------------+
| 1 |
+------------------------------------------+
1 row in set (0.00 sec)mysql> select json_contains('{"age": 18, "name": "morris", "address": "china"}', '18', '$.name');
+------------------------------------------------------------------------------------+
| json_contains('{"age": 18, "name": "morris", "address": "china"}', '18', '$.name') |
+------------------------------------------------------------------------------------+
| 0 |
+------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
json_array创建json数组
mysql> select json_array("a", "b", "c", "d");
+--------------------------------+
| json_array("a", "b", "c", "d") |
+--------------------------------+
| ["a", "b", "c", "d"] |
+--------------------------------+
1 row in set (0.00 sec)
json_contains_path判断json是否包含某个key
mysql> select json_contains_path('{"a": 1, "b": 2, "c": {"d": 4}}', 'one', '$.a', '$.e');
+----------------------------------------------------------------------------+
| json_contains_path('{"a": 1, "b": 2, "c": {"d": 4}}', 'one', '$.a', '$.e') |
+----------------------------------------------------------------------------+
| 1 |
+----------------------------------------------------------------------------+
1 row in set (0.01 sec)mysql> select json_contains_path('{"a": 1, "b": 2, "c": {"d": 4}}', 'all', '$.a', '$.e');
+----------------------------------------------------------------------------+
| json_contains_path('{"a": 1, "b": 2, "c": {"d": 4}}', 'all', '$.a', '$.e') |
+----------------------------------------------------------------------------+
| 0 |
+----------------------------------------------------------------------------+
1 row in set (0.00 sec)
json_keys查询json所有的key
mysql> select json_keys('{"a": 1, "b": 2, "c": {"d": 4}}');
+----------------------------------------------+
| json_keys('{"a": 1, "b": 2, "c": {"d": 4}}') |
+----------------------------------------------+
| ["a", "b", "c"] |
+----------------------------------------------+
1 row in set (0.00 sec)
json_pretty格式化json
mysql> select json_pretty('{"a": 1, "b": 2, "c": {"d": 4}}');
+-------------------------------------------------+
| json_pretty('{"a": 1, "b": 2, "c": {"d": 4}}') |
+-------------------------------------------------+
| {"a": 1,"b": 2,"c": {"d": 4}
} |
+-------------------------------------------------+
1 row in set (0.00 sec)
json_depth查询json的深度
mysql> select json_depth('{"a": 1, "b": 2, "c": {"d": 4}}');
+-----------------------------------------------+
| json_depth('{"a": 1, "b": 2, "c": {"d": 4}}') |
+-----------------------------------------------+
| 3 |
+-----------------------------------------------+
1 row in set (0.00 sec)
json_length返回json元素的个数
mysql> select json_length('{"a": 1, "b": 2, "c": {"d": 4}}');
+------------------------------------------------+
| json_length('{"a": 1, "b": 2, "c": {"d": 4}}') |
+------------------------------------------------+
| 3 |
+------------------------------------------------+
1 row in set (0.00 sec)
————————————————
json_remove根据key删除元素
mysql> select json_remove('{"a": 1, "b": 2, "c": {"d": 4}}', "$.c");
+-------------------------------------------------------+
| json_remove('{"a": 1, "b": 2, "c": {"d": 4}}', "$.c") |
+-------------------------------------------------------+
| {"a": 1, "b": 2} |
+-------------------------------------------------------+
1 row in set (0.00 sec)
json_replace替换元素
mysql> select json_replace('{"a": 1, "b": 2, "c": {"d": 4}}', "$.c", "cc");
+--------------------------------------------------------------+
| json_replace('{"a": 1, "b": 2, "c": {"d": 4}}', "$.c", "cc") |
+--------------------------------------------------------------+
| {"a": 1, "b": 2, "c": "cc"} |
+--------------------------------------------------------------+
1 row in set (0.01 sec)
json_search搜索元素
mysql> select json_search('["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]', 'one', 'abc');
+--------------------------------------------------------------------------------------+
| json_search('["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]', 'one', 'abc') |
+--------------------------------------------------------------------------------------+
| "$[0]" |
+--------------------------------------------------------------------------------------+
1 row in set (0.01 sec)mysql> select json_search('["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]', 'all', 'abc');
+--------------------------------------------------------------------------------------+
| json_search('["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]', 'all', 'abc') |
+--------------------------------------------------------------------------------------+
| ["$[0]", "$[2].x"] |
+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
json_set往json中插入元素
存在则覆盖,不存在则新增。
mysql> select json_set('{"a": 1, "b": 2, "c": {"d": 4}}', "$.a", "aaa", "$.e", "eee");
+-------------------------------------------------------------------------+
| json_set('{"a": 1, "b": 2, "c": {"d": 4}}', "$.a", "aaa", "$.e", "eee") |
+-------------------------------------------------------------------------+
| {"a": "aaa", "b": 2, "c": {"d": 4}, "e": "eee"} |
+-------------------------------------------------------------------------+
1 row in set (0.00 sec)
json_storage_size查看json存储占用的空间大小
mysql> select json_storage_size('{"a": 1, "b": 2, "c": {"d": 4}}');
+------------------------------------------------------+
| json_storage_size('{"a": 1, "b": 2, "c": {"d": 4}}') |
+------------------------------------------------------+
| 41 |
+------------------------------------------------------+
1 row in set (0.00 sec)
json_type查询json的类型
mysql> select json_type('{"a": 1, "b": 2, "c": {"d": 4}}');
+----------------------------------------------+
| json_type('{"a": 1, "b": 2, "c": {"d": 4}}') |
+----------------------------------------------+
| OBJECT |
+----------------------------------------------+
1 row in set (0.01 sec)
json_valid判断json是否是有效的
mysql> select json_valid('{"a": 1, "b": 2, "c": {"d": 4}}');
+-----------------------------------------------+
| json_valid('{"a": 1, "b": 2, "c": {"d": 4}}') |
+-----------------------------------------------+
| 1 |
+-----------------------------------------------+
1 row in set (0.00 sec)
JSON索引
JSON类型数据本身无法直接创建索引,需要将需要索引的JSON数据重新生成虚拟列(Virtual Columns)之后,对该列进行索引。
mysql> create table test_json_index(id int primary key auto_increment, data json, gen_col varchar(10) generated always as (json_extract(data, '$.name')));
mysql> insert into test_json_index(data) values('{"name":"morris","age":18,"address":"china"}');
mysql> insert into test_json_index(data) values('{"name":"tom","age":16,"mail":"tomcat@google.com"}');
mysql> select * from test_json_index;
+----+---------------------------------------------------------+----------+
| id | data | gen_col |
+----+---------------------------------------------------------+----------+
| 1 | {"age": 18, "name": "morris", "address": "china"} | "morris" |
| 2 | {"age": 16, "mail": "tomcat@google.com", "name": "tom"} | "tom" |
+----+---------------------------------------------------------+----------+
mysql> select * from test_json_index where gen_col='morris'; -- 查不到数据
mysql> select * from test_json_index where gen_col='"morris"';
+----+---------------------------------------------------+----------+
| id | data | gen_col |
+----+---------------------------------------------------+----------+
| 1 | {"age": 18, "name": "morris", "address": "china"} | "morris" |
+----+---------------------------------------------------+----------+
要想在查询时不加引号,可以在加索引时使用json_unquote去除引号。
mysql> create table test_json_index2(id int primary key auto_increment, data json, gen_col varchar(10) generated always as (json_unquote(json_extract(data, '$.name'))));
Query OK, 0 rows affected (0.08 sec)mysql> create table test_json_index3(id int primary key auto_increment, data json, gen_col varchar(10) generated always as (JSON_UNQUOTE(data->'$.name')));
Query OK, 0 rows affected (0.08 sec)mysql> create table test_json_index4(id int primary key auto_increment, data json, gen_col varchar(10) generated always as (data->>'$.name'));
Query OK, 0 rows affected (0.05 sec)
相关文章:
MySQL数据类型之JSON
MySQL数据类型之JSON SON类型是MySQL 5.7版本新增的数据类型,用好JSON数据类型可以有效解决很多业务中实际问题。 使用JSON数据类型,推荐用MySQL 8.0.17以上的版本,性能更好,同时也支持Multi-Valued Indexes; JSON数…...
nginx_0.7.65_00截断_nginx解析漏洞
nginx_0.7.65_00截断_nginx解析漏洞 文章目录 nginx_0.7.65_00截断_nginx解析漏洞1 环境搭建1 解压nginx_0.7.652 双击启动,如有闪退,端口占用的情况,在conf文件nginx.conf修改一下端口号3 查看一下进程有nginx4 启动成功访问127.0.0.1:18080…...
建站百科:HTTP返回状态码是什么?
HTTP返回状态码是用于表示HTTP响应状态的三位数字代码。HTTP状态码由6位数字组成,每3位数字代表一种状态,如200表示成功,404表示未找到资源,500表示服务器内部错误等。 常用的状态码包括: 200:正常的网页…...
人像摄影简记
文章目录 光影室外顺光室内顺光室外逆光室内逆光散射光 姿势错误姿势避免摆拍技巧场景互动抓拍利用道具 构图构图目的构图基础概念画幅:横画幅和竖画幅景别:全身、大半身及半身、特写拍摄高度:平拍、俯拍和仰拍拍摄方位:正面、前侧…...
【Java 基础篇】Java 实现模拟斗地主游戏
欢迎阅读本篇博客,在这篇博客中,我们将详细讲解如何使用Java编写一个简单的模拟斗地主游戏。这个项目将帮助您了解Java编程中的一些基本概念,如面向对象编程、集合框架的使用、随机数生成等。 引言 斗地主是一种非常受欢迎的纸牌游戏&#…...
计算机专业毕业设计项目推荐09-个人医疗系统(Spring+Js+Mysql)
个人医疗系统(SpringJsMysql) **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及…...
安卓Compose(一)
为什么学习安卓Compose? 安卓Compose是一个相对新的UI工具包,它的出现为安卓应用程序开发带来了一系列的好处。下面是一些学习Compose的理由: 声明式UI 与传统的安卓XML布局相比,Compose使用了声明式的UI编程范例。这意味着你可以…...
【Linux学习】03Linux用户和权限
Linux(B站黑马)学习笔记 01Linux初识与安装 02Linux基础命令 03Linux用户和权限 文章目录 Linux(B站黑马)学习笔记前言03Linux用户和权限认知root用户root用户(超级管理员)su和exit命令sudo命令 用户、用户…...
LeetCode 面试题 05.04. 下一个数
文章目录 一、题目二、Java 题解2.1 求大数:2.2 求小数: 一、题目 下一个数。给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。 示例1: 输入: n…...
SDXL prompt 笔记
模型 模型有两个,分别是 stable-diffusion-xl-base-1.0、stable-diffusion-xl-refiner-1.0。 base 模型是用来做文生图,refiner 模型是用来做图生图的。 SDXL 模型之 base、refiner 和 VAE_云水木石的博客-CSDN博客 分辨率 默认是1024*1024…...
使用Redis管道进行查询接口性能优化
一、引入 在我们的正常项目开发过程中,我们会通过Redis缓存数据,来帮我们进行异步任务,分担外部的请求压力 但是Redis缓存也有一定的限制,因为我们在向请求过来时,Redis客户端都要向服务端发送一次请求,相应…...
初学vue.js
准备Vue.js环境 ① 下载环境: javaScript语言的程序包:外部js文件 对于Vue来说,导入Vue的外部js文件就能够使用Vue框架了。 Vue框架的js文件获取: 官网提供的下载地址:https://cdn.jsdelivr.net/npm/vue/dist/vue.js ②导入环境…...
React的thunk中间件
Thunk 是一种中间件,它可以在 Redux 中处理异步操作。Thunk 中间件允许你在 action 中返回一个函数,而不仅仅是一个普通的 action 对象。这个返回的函数可以接收 dispatch 和 getState 作为参数,并且可以在函数内部进行异步操作。当使用 Thun…...
数组初学者向导:使用Python从零开始制作经典战舰游戏
引言 战舰游戏,一个广受欢迎的经典游戏,为玩家提供了策略与猜测的完美结合。这个游戏的核心思想是通过猜测敌方船只的位置并尝试击沉它们来赢得比赛。在这篇文章中,我们将使用Python语言和数组来构建这款游戏,让你更加了解数组的…...
【STM32】IAP升级 预备知识
IAP(In Application Programming)简介 Flash够大的情况下,上电后的程序通过修改 MSP 的方式,可以在一块Flash上存在多个功能差异的程序。 IAP是为了在执行正常功能前,为了升级功能,提前运行的一段程序。这…...
asp.net网站的建立及运行
点击创建新项目 在输入框中输入asp.net,并选择图中的 点击下一步 点击创建 然后,右键,添加,新建项 选择web窗体 点击添加 点击视图,工具箱 选择一个label,记住这个id 空白处右键,查看代码 添…...
怎么把webm转换成mp4?
怎么把webm转换成mp4?与MP4这位视频格式大哥相比,Webm这种视频格式还有很多小伙伴对它不太熟悉,因为大家平时也是偶尔才能接触到,属于不常用的视频格式。Webm是一种开放、免费的媒体文件格式,尽管如今它的应用范围比以…...
RabbitMQ 消息应答
每日一句 物是人非事事休,欲语泪先流。 概述 为了保证消息在发送过程中不丢失,RabbitMQ引入了消息应答机制, 消费者在接收到消息并且处理该消息后,告诉RabbitMQ它已经处理了,RabbitMQ可以把消息删除了。 自动应答 消息发送后立即被认为已经传送成功,这种模式需要在…...
【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )
文章目录 一、全局函数 与 成员函数 相互转化1、成员函数转为全局函数 - 多了一个参数2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 二、有参构造函数设置默认参数值三、返回匿名对象与返回引用四、完整代码示例 一、全局函数 与 成员函数 相互转化 1、成员函数转为全局…...
游戏遇到的问题
天涯明月刀 就是天刀的假全屏,很多天刀玩家可能玩其他游戏比较少或者对电脑了解不多,不在意帧数,但是肯定还是有一部分玩家发现了这个问题,就是“我使命召唤12都能跑到60帧的机器跑个破天刀40帧甚至30帧?”问题何在呢࿱…...
如何快速掌握Subtitle Edit:新手也能上手的完整实战指南
如何快速掌握Subtitle Edit:新手也能上手的完整实战指南 【免费下载链接】subtitleedit the subtitle editor :) 项目地址: https://gitcode.com/gh_mirrors/su/subtitleedit 你是不是经常遇到下载的字幕与视频不同步?或者想要为自制视频添加专业…...
探索固定翼无人机编队控制:从高效协同到PX4-Autopilot落地实践
探索固定翼无人机编队控制:从高效协同到PX4-Autopilot落地实践 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot PX4-Autopilot作为开源无人机飞控系统的核心框架,通过模块化设…...
查重和AI率双高?毕业之家的“双降”引擎真能救命!
根据2026年最新实测数据与主流技术社区(如CSDN)的综合评测,当前AI论文写作工具排行榜中,PaperRed 与 毕业之家 稳居中文论文写作领域的前两名。以下是基于权威榜单整理的主流工具排名概览及两款头部产品的核心功能详解:…...
终极Koikatu HF Patch配置指南:游戏体验全面升级方案
终极Koikatu HF Patch配置指南:游戏体验全面升级方案 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch Koikatu HF Patch作为非官方增强…...
libiec61850开源库核心功能完全实战指南:从协议解析到电力系统通信应用
libiec61850开源库核心功能完全实战指南:从协议解析到电力系统通信应用 【免费下载链接】libiec61850 Official repository for libIEC61850, the open-source library for the IEC 61850 protocols 项目地址: https://gitcode.com/gh_mirrors/li/libiec61850 …...
【AI智能体】Dify 实战:构建企业级自然语言SQL查询引擎
1. 从个人工具到企业级解决方案的跨越 第一次接触Dify的自然语言转SQL功能时,我被它的便捷性惊艳到了。只需要输入"显示上季度销售额最高的产品",系统就能自动生成正确的SQL语句。但当我尝试在团队中推广使用时,各种问题接踵而至&a…...
openclaw里面如何添加channel
在 OpenClaw 中添加 Channel(消息通道 / 渠道),核心是通过 CLI 命令 或直接编辑 配置文件,将 Telegram、Discord、飞书、WhatsApp 等 IM 平台接入网关(Gateway),并绑定到 Agent。以下是完整、可…...
BilibiliDown:基于Java的B站视频下载技术方案与实现解析
BilibiliDown:基于Java的B站视频下载技术方案与实现解析 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors…...
Wan2.2-I2V-A14B效果展示:动态运镜+光影变化的高质量视频样例
Wan2.2-I2V-A14B效果展示:动态运镜光影变化的高质量视频样例 1. 惊艳的视频生成能力 Wan2.2-I2V-A14B文生视频模型带来了令人惊叹的视频生成效果。这个私有部署镜像经过深度优化,能够根据文字描述生成具有专业级动态运镜和光影变化的高质量视频。想象一…...
Obsidian PDF++:革新PDF文献管理的高效工具
Obsidian PDF:革新PDF文献管理的高效工具 【免费下载链接】obsidian-pdf-plus PDF: the most Obsidian-native PDF annotation & viewing tool ever. Comes with optional Vim keybindings. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-pdf-plus …...
