MySQL Json类型的一个坑

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL中JSON类型有个隐藏的坑,底层会对json结构重排序后保存,目的是为了优化搜索效率;但是针对结构不能改变的业务来说,就是一个大坑

简介

MySQL 5.7 增加了 JSON 数据类型的支持; 可以直接通过内置语法对json结构数据进行操作
注意: 对json结构位置不能变更的业务,强烈建议使用varchar或者text等结构存储,json类型会优化key顺序

查询语法

语法 描述 最小可用版本(5.7+) 已弃用
-> 评估路径后从 JSON 列返回值;相当于 JSON_EXTRACT()。
->> 评估路径并取消引用结果后从 JSON 列返回值;相当于 JSON_UNQUOTE(JSON_EXTRACT())。 5.7.13
JSON_APPEND() 将数据附加到 JSON 文档 Y
JSON_ARRAY() 创建 JSON 数组
JSON_ARRAY_APPEND() 将数据附加到 JSON 文档
JSON_ARRAY_INSERT() 插入 JSON 数组
JSON_CONTAINS() JSON 文档是否在路径中包含特定对象
JSON_CONTAINS_PATH() JSON 文档是否包含路径中的任何数据
JSON_DEPTH() JSON 文档的最大深度
JSON_EXTRACT() 从 JSON 文档返回数据
JSON_INSERT() 将数据插入 JSON 文档
JSON_KEYS() JSON 文档中的键数组
JSON_LENGTH() JSON 文档中的元素数
JSON_MERGE() 合并 JSON 文档,保留重复键。JSON_MERGE_PRESERVE() 的弃用同义词 5.7.22
JSON_MERGE_PATCH() 合并 JSON 文档,替换重复键的值 5.7.22
JSON_MERGE_PRESERVE() 合并 JSON 文档,保留重复键 5.7.22
JSON_OBJECT() 创建 JSON 对象
JSON_PRETTY() 以人类可读的格式打印 JSON 文档 5.7.22
JSON_QUOTE() 引用 JSON 文档
JSON_REMOVE() 从 JSON 文档中删除数据
JSON_REPLACE() 替换 JSON 文档中的值
JSON_SEARCH() JSON 文档中值的路径
JSON_SET() 将数据插入 JSON 文档
JSON_STORAGE_SIZE() 用于存储 JSON 文档的二进制表示的空间 5.7.22
JSON_TYPE() JSON 值的类型
JSON_UNQUOTE() 取消引用 JSON 值
JSON_VALID() JSON值是否有效

案例

创建 JSON

SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());
SELECT JSON_OBJECT('id', 87, 'name', 'carrot');
SELECT JSON_QUOTE('null'), JSON_QUOTE('"null"'),JSON_QUOTE('[1, 2, 3]');

搜索JSON

select b.c ->'$.a' from  ( select JSON_OBJECT('a',"10","b","15","c","25") as c  ) b;
select b.c ->>'$.a' from  ( select JSON_OBJECT('a',"10","b","15","c","25") as c  ) b;

JSON字符串转JSON对象

select b.js->>'$.a' from (select CAST('{"a":"10","b":"15","x":"25"}' as json) js ) as b;

注意事项

  • JSON结构重排序
现象:  
    执行 select CAST('{"aaa":"10","d":"15","cc":"25","c":"11"}' as json) 后返回数据
    {"c": "11", "d": "15", "cc": "25", "aaa": "10"}

原因: MySQL会针对JSON结构优化排序,提高搜索效率;排序规则是先根据key长度排序,长度相同根据ASCII()值排序
    select  ASCII('d'),ASCII('c')

相关资料

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
机器学习/深度学习 关系型数据库 MySQL
mysql bit对gorm使用何种类型?
在GORM中使用MySQL的BIT类型时,通常使用 `bool`类型来处理BIT(1),使用 `[]byte`类型来处理BIT(N)(N > 1)。通过正确的类型映射和位操作,可以高效地处理位字段数据。确保在定义结构体字段时,明确指定字段类型,以便GORM能够正确地处理数据库交互。
26 18
|
1月前
|
存储 关系型数据库 MySQL
mysql怎么查询longblob类型数据的大小
通过本文的介绍,希望您能深入理解如何查询MySQL中 `LONG BLOB`类型数据的大小,并结合优化技术提升查询性能,以满足实际业务需求。
127 6
|
2月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
63 4
|
2月前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
69 8
|
3月前
|
XML JSON 数据可视化
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
本文详细介绍了不同数据集格式之间的转换方法,包括YOLO、VOC、COCO、JSON、TXT和PNG等格式,以及如何可视化验证数据集。
619 1
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
|
3月前
|
关系型数据库 MySQL
用dbeaver创建一个enum类型,并讲述一部分,mysql的enum类型的知识
这篇文章介绍了如何在DBeaver中创建MySQL表的枚举(ENUM)字段,并探讨了MySQL中ENUM类型的一些行为特点,例如ENUM值的默认排序和在插入重复值时的表现。
72 1
用dbeaver创建一个enum类型,并讲述一部分,mysql的enum类型的知识
|
2月前
|
JSON 关系型数据库 MySQL
MySQL JSON数据存储结构与操作
通过本文的介绍,我们了解了MySQL中JSON数据类型的基本操作、常用JSON函数、以及如何通过索引和优化来提高查询性能。JSON数据类型为存储和操作结构化数据提供了灵活性和便利性,在现代数据库应用中具有广泛的应用前景。希望本文对您在MySQL中使用JSON数据类型有所帮助。
293 0
|
2月前
|
关系型数据库 MySQL Java
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
57 0
|
4月前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
191 4
|
4月前
|
自然语言处理 算法 Java
Java如何判断两句话的相似度类型MySQL的match
【9月更文挑战第1天】Java如何判断两句话的相似度类型MySQL的match
29 2