MySQL JSON数据类型

news2024/9/25 17:21:42

在日常开发中,我们经常会在 MySQL 中使用 JSON 字段,比如很多表中都有 extra 字段,用来记录一些特殊字段,通过这种方式不需要更改表结构,使用相对灵活。
目前对于 JSON 字段的实践各个项目不尽相同,MySQL 表结构中使用的字段类型一般为 text、varchar 或者 json。

基础知识

MySQL 在 5.7.8 版本后,开始支持 JSON 数据类型(JSON 协议)。

合法性校验

JSON 数据类型会对字段进行合法性校验,比如插入或者更新的值不合法,会操作失败。

CREATE TABLE `json_test` (
  `id` int NOT NULL AUTO_INCREMENT,
  `extra` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- invalid json
insert into json_test values(1, '{"age":x}');
update json_test set extra = '{"age":x}' where id = 1;

在这里插入图片描述

底层存储

JSON 数据类型优化了底层存储(二进制存储),让用户能够更快地访问 JSON 中的元素。相比于存储 JSON 的字符串数据类型(VARCHAR、TEXT),JSON 底层的二进制存储不需要从文本进行 JSON 解析。
JSON 数据类型能够存储的空间和 LONGTEXT 和 LONGBLOB 类似,最多能存储 4G。

工具函数

函数功能示例
JSON_VALID检查输入的字符串是否为一个合法的 JSON 文本,如是返回 1,否则返回 0。SELECT JSON_VALID(‘{“id”: 1, “name”: “John”}’); – 返回值为 1 SELECT JSON_VALID(‘{“id”: 1, “name”: “John”, }’);-- 返回值为 0
JSON_EXTRACT从 JSON 文本中提取指定的数据。SELECT JSON_EXTRACT(‘{“id”: 1, “name”: “John”}’, ‘$.name’);-- 返回值为 “John”
JSON_SET在一个给定的 JSON 文本中设置或覆盖一个给定的路径的值,并返回新的 JSON 文本。SELECT JSON_SET(‘{“id”: 1, “name”: “John”}’, ‘$.name’, ‘Mike’);-- 返回值为 ‘{“id”: 1, “name”: “Mike”}’
JSON_REMOVE从一个给定的 JSON 文本中删除指定的路径的值,并返回新的 JSON 文本。SELECT JSON_REMOVE(‘{“id”: 1, “name”: “John”}’, ‘$.name’);-- 返回值为 ‘{“id”: 1}’
JSON_ARRAY创建一个包含指定值的 JSONArray。SELECT JSON_ARRAY(1, “John”, true);-- 返回值为 ‘[1, “John”, true]’
JSON_OBJECT创建一个包含指定键值对的 JSONObject。SELECT JSON_OBJECT(‘id’, 1, ‘name’, ‘John’, ‘is_active’, true);-- 返回值为 ‘{“id”: 1, “name”: “John”, “is_active”: true}’

你可以使用 INSERT 语句插入 JSON 数据:

INSERT INTO json_test (extra) VALUES ('{"customer": "John Doe", "items": {"product": "apple", "quantity": 1}}');

你可以使用 -> 操作符从 JSON 字段中查询数据:

SELECT extra->'$.customer' AS customer FROM orders;
在这个例子中,查询返回 extra 字段中的 customer 属性。

你也可以使用 JSON_SET 函数更新 JSON 字段的值:

UPDATE json_test SET extra = JSON_SET(extra, '$.customer', 'Jane Doe') WHERE id = 1;
在这个例子中,更新 extra 字段中的 customer 属性的值为 'Jane Doe'

以上就是在 MySQL 中使用 JSON 数据类型的一些基本方法。具体使用时,可能需要根据你的实际需求进行调整。

注意事项

  • 默认值:JSON 不能有非 NULL 默认值(和 TEXT 类似)。

  • 索引 JSON 列不能直接索引,如果要建索引,可以参考
    https://dev.mysql.com/doc/refman/5.7/en/create-table-secondary-indexes.html#json-column-indirect-index,但一般来说,如果要在 JSON 字段中建索引,不如考虑将字段提取为单独一列。

  • 数据完整性:与使用结构化的表格数据相比,使用 JSON 数据类型可能更难保证数据的完整性。例如,你不能在 JSON 字段中定义外键约束。

  • 查询复杂性:查询 JSON 数据通常比查询结构化的表格数据更复杂。

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

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

相关文章

SpringCloud Alibaba 深入源码 - Nacos 分级存储模型、支撑百万服务注册压力、解决并发读写问题(CopyOnWrite)

目录 一、SpringCloudAlibaba 源码分析 1.1、SpringCloud & SpringCloudAlibaba 常用组件 1.2、Nacos的服务注册表结构是怎样的? 1.2.1、Nacos的分级存储模型(理论层) 1.2.2、Nacos 源码启动(准备工作) 1.2.…

windows11上安装虚拟机VMware

1、安装虚拟机(待补充) 第二步:安装VMware tools 实现windows文件上传到虚拟机中 1、安装好虚拟机后,查看虚拟机ip用Xshell连接虚拟机,并安装VMware tools(只有安装了VMware tools才能实现虚拟机和本机的文件共享。在…

P4学习(六)实验三:a Control Plane using P4Runtime

目录 一. 实验目的二.阅读MyController.py文件1.导入P4Runtime的库2.main部分1. P4InfoHelper 实例化2. 创建交换机连接3. 设置主控制器4. 安装 P4 程序5. 写入隧道规则6. 读取表项和计数器(注释掉的部分)7. 定时打印隧道计数器8. 异常处理9. 关闭交换机…

动态规划系列问题之打家劫舍和买股票

动态规划系列问题 1.打家劫舍问题1.1打家劫舍I1.2打家劫舍II1.3打家劫舍III 2.买股票问题2.1买股票的最佳时机2.2买股票的最佳时机II2.3买股票的最佳时机III2.4买股票的最佳时机IV2.5买卖股票的最佳时机含冷冻期2.6买卖股票的最佳时机含手续费 题目解析参考了代码随想录 https:…

【Redis漏洞利用总结】

前言 redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis默认使用 6379 端口。 一、redis未授权访问漏洞 0x01 漏洞描述 描述: Redis是一套开源的使用ANSI C编写、支持网络、可基于内存…

基于深度学习的交通标志检测和识别(从原理-环境配置-代码运行)

基于深度学习的交通标志检测和识别是一种先进的计算机视觉技术,利用深度神经网络模型来准确地检测和识别道路上的各种交通标志。下面是对其介绍并分点阐述其重要性和应用场景: 1. 深度学习技术: 交通标志检测和识别利用深度学习技术&#x…

笔试面试题——二叉树进阶(二)

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、二叉搜索树与双向链表1、题目讲解2、思路讲解递归展开图3、代码实现 二、从前序遍历和中序…

刷题 ------ 排序

文章目录 1.K 次取返后最大化的数组和(堆)2.数组的相对排序(桶)3.最小绝对差4.根据数字二进制下1的数目排序(qsort)5.有多少小于当前数字的数字6.非递增顺序的最小子序列7.按照频率将数组升序排序&#xff…

unity 2021 发布安卓版本,谷歌限流国内,报错CommandInvokationFailure: Gradle build failed

在使用 Unity 2022 打包安卓项目时,遇到 gradle 无法访问或下载超级慢最终超时出错的问题解决 解决方案: 1. 在 Build Settings 左下角打开 Player Settings,在 Android 平台图标选项卡下找到 Publishing Settings 区域 勾选 2. 从国内…

​《WebKit 技术内幕》学习之九(3): JavaScript引擎

3 JavaScriptCore引擎 3.1 原理 JavaScriptCore引擎是WebKit中的默认JavaScript引擎,也是苹果在开源WebKit项目之后,开源的另外一个重要的项目。同其他很多引擎一样,在刚开始的时候它的主要部分是一个基于抽象语法树的解释器,这…

【数据库原理】(38)数据仓库

数据仓库(Data Warehouse, DW)是为了满足企业决策分析需求而设计的数据环境,它与传统数据库有明显的不同。 一.数据库仓库概述 定义: 数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持企业管理和…

成都爱尔胡建斌院长提醒视网膜脱离到底有多危险?!

视网膜脱离是视网膜神经上皮层与色素上皮层的分离。 视网膜脱离之危险,在与视网膜脱离后外层视网膜得不到脉络膜的血液供应,如不及时复位,视网膜感光细胞会发生凋亡,视力就不易恢复。 就症状来说,患者发病初期眼前多有…

0122-1-JavaScript高级程序设计11-27章

前言 通过阅读这本书写下的一些笔记 《JavaScript高级程序设计》 第11章——期约与异步函数 11.2 期约(promise):是对 尚不存在结果 的一个替身。 /*** 期约与异步函数* 什么是Promise?* (1)从语法上来说:Promis…

np.argsort排序问题(关于位次)-含GitHub上在numpy项目下提问的回复-总结可行方案

np.argsort 与获取位相关问题 位次: 数组中的数据在其排序之后的另一个数组中的位置 [1,0,2,3] 中 0的位次是1 1的位次是2 2的位次是3 3的位次是4 这里先直接给出结论,np.argsort()返回的索引排序与实际位次在确实在某些情况下会出现一致,但后来numpy的开…

HubSpot SEO功能好用吗?

HubSpot对于SEO(搜索引擎优化)提供了全面的工具和功能,帮助用户优化其网站以在搜索引擎中取得更好的排名。以下是关于HubSpot SEO的一些关键方面: 内容优化: HubSpot的内容工具允许用户创建并优化吸引人的内容。通过关…

pikachu验证码绕过第三关攻略

打开pikachu靶场第三关: 挂上代理,随便输入账户密码: 返回bp。进行放包发现显示token错误。 每一次登录的返回包会带有token相关数据用于下一次的登录认证: 进行替换token值: 替换完成开始进行检点的爆破:…

s3fs挂载minio集群到本地目录

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 1. 前言 MinIO 是一款高性能的对象存储,与 Amazon S3 云存储服务兼容,并且号称是世界上最快的对象存储服…

LLM RAG 多种方式装载LLM的实践

一、大模型系统中检索增强生成(RAG)的意义 当前大模型在处理特定领域或者高度专业化的查询时表现出知识缺失,当所需信息超出模型训练数据范围或需要最新数据时,大模型可能无法提供准确答案。基于行业SOP、行业标准、互联网实时信…

中间件-缓存、索引、日志

文章目录 缓存中间件本地缓存中间件分布式缓存中间件全文索引中间件分布式日志中间件小结 缓存中间件 缓存是性能优化的一大利器 我们先一起来看一个用户中心查询用户信息的基本流程 这时候,如果查找用户信息这个 API 的调用频率增加,并且在整个业务流…

强化学习(四)动态规划——1

动态规划算法(DP):在马尔可夫决策过程(MDP)的完美环境模型下计算最优策略。但其在强化学习中实用性有限,其一是它是基于环境模型已知;其二是它的计算成本很大。但它在理论伤仍然很重要&#xff…