MySQL JSON数据类型

在日常开发中,我们经常会在 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.hqwc.cn/news/423377.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Kafka】开发实战和Springboot集成kafka

目录 消息的发送与接收生产者消费者 SpringBoot 集成kafka服务端参数配置 消息的发送与接收 生产者 生产者主要的对象有: KafkaProducer , ProducerRecord 。 其中 KafkaProducer 是用于发送消息的类, ProducerRecord 类用于封装Kafka的消息…

k8s中服务器容器tcp连接数量优化

netty的http1服务器在运行一段时间后会无法提供服务,返回客户端socket hang up 使用apipost测试抓包显示三次握手后被reset 修改net/core/somaxconn 登录容器,cat /proc/sys/net/core/somaxconn显示128,对于一个服务器来说,这个…

深入理解Kubernetes探针和.NET服务健康检查机制

前言 随着越来越多的软件采用云原生和微服务架构,我们面临着更多的技术挑战,比如: Kubernetes如何在容器服务异常终止、死锁等情况下,发现并自动重启服务;当服务依赖的关键服务(例如数据库,Red…

python-大数据分析-基于大数据的QQ音乐数据分析系统设计与实现

设计说明 国内外数字音乐市场经过几百年的发展, 收录的音乐作品总数量已经达到了相当可观的程度, 面对数量如此庞大的音乐作品, 如何更加便捷、高效的让用户听到喜欢的音乐作品, 是音乐平台必须要考虑的事情, 也是科研人员非常感兴趣的研究课题。 本文首先对数据分析中涉及到了…

【心得】java反序列化漏洞利用启蒙个人笔记

目录 前置基础概念 java的反序列化利用概念baby题 例题1 例题2 java反序列化启蒙小结: URLDNS链 一句话总结: 简单分析: 利用点: 示例: 前置基础概念 序列化 类实例->字节流 反序列化 字节流->类实…

一文(10图)了解Cornerstone3D核心概念(万字总结附导图)

Cornerstone3D介绍 Cornerstone3D是一个专门为处理三维医学影像而设计的JavaScript库。 它是Cornerstone项目的一部分,旨在为医学影像社区提供高性能、可扩展且易于使用的开源Web工具,专注于提供交互式的3D医学图像浏览体验,适用于多种医学…

【代码随想录】刷题笔记Day54

前言 差单调栈就结束代码随想录一刷啦,回家二刷打算改用python补充进博客,小涛加油!!! 647. 回文子串 - 力扣(LeetCode) 双指针法 中心点外扩,注意中心点可能有一个元素可能有两个…

VsCode容器开发 - VsCode连接远程服务器上的docker

VsCode容器开发 - VsCode连接远程服务器上的docker 前言 之前在服务器上的Docker内开发,文件编辑起来就很不爽。不如使用VsCode直接打开远程服务器上的Docker,这样就能在VsCode里直接无缝编辑Docker里的文件了。 但是百度和必应得到的中文结果都很奇葩…

excel统计分析——S-N-K法多重比较

参考资料:生物统计学 S-N-K法全称Newman-Keuls或Student-Newman-Keuls法,又称复极差检验法或q检验法。最小显著极差的计算与Tukey法相同,只是将第一自由度换成了秩次距m,即计算临界值时,df1m,df2df&#xf…

数据分析的理念、流程、方法、工具(上)

一、数据的价值 1、数据驱动企业运营 从电商平台的「猜你喜欢」到音乐平台的「心动模式」,大数据已经渗透到了我们生活的每一个场景。不论是互联网行业,还是零售业、制造业等,各行各业都在依托互联网大数据(数据采集、数据存储、…

git merge和git rebase区别

具体详情 具体常见如下,假设有master和change分支,从同一个节点分裂,随后各自进行了两次提交commit以及修改。随后即为change想合并到master分支中,但是直接git commit和git push是不成功的,因为分支冲突了【master以…

Unity中URP下的 额外灯 逐像素光 和 逐顶点光

文章目录 前言一、额外灯 的 逐像素灯 和 逐顶点灯1、存在额外灯的逐像素灯2、存在额外灯的逐顶点灯 二、测试这两个宏的作用1、额外灯的逐像素灯2、额外灯的逐顶点灯 前言 在之前的文章中,我们了解了 主光相关的反射计算。 Unity中URP下的SimpleLit的 Lambert漫反…