MySQL - 数据类型 Json 中 key 随机排序解决方案

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS Agent(兼容OpenClaw),2核4GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: MySQL - 数据类型 Json 中 key 随机排序解决方案

背景

在MySQL中,是有json字段类型的,同时也有json操作的相关方法,也提供json数据的校验,给我们保存json数据提供了方便;

但当我们向json中保存一个json时,其内容会被数据库重新格式化,并调整其中key的顺序,该动作并不受外界控制;

在一些特殊应用的场合,例如:与金蝶对接的过程中,他们有一个"特殊要求",就是要求json中的key的顺序要与其模板中的一致,此时出现麻烦。

解决思路1-找金蝶

首先金蝶这个特殊要求,本身不合理,因为,JSON字段本身就应该具有无序映射,这才是正常对接的方式;

所以我们第一时间想到找金蝶解决,但是金蝶很NB,其实施工程师给的回复是:"不是我不愿意改,接口没问题,你让总部改,总部不可能改的啊,况且总部也不可能专门针对你改接口啊,就好比你做阿里微信接口,你也不可能让阿里微信为你改接口的啊"。

此路不通

解决思路2-字符串替换

即然定义为json字段时,其key会排序,那么我们把它改为text呢?

结果是,写入前与写入后结果一致,不会排序;但我们在写入前,是需要有json操作的,若需要按json类型操作就首先需要将之转为json,然后再更新其内容,这个过程仍然会引起字段的重新排序。

如果全部改成字符串拼接的方式操作,这将是巨大工程。

此路不通

解决思路3-寻找key排序的规律

我们尝试寻找key排序的规律,首先发现,不论将key弄的多么乱,保存至数据库时,它都是调整成了固定的顺序,并不是随机的,这是一个重大的发现。

是不是数据库版本问题?升级可以调整?进入官网,其并未对此说明。此路不通

比如:这两个字段,同级调整,不论它放在上面,还是放下面,保存至数据库会都恢复成这个状态

  • 正常MySQL排序

接着我们发现好像它也并不是按照字母排序的,按感觉说,如果是按字母顺序排的,"FP"开头的key,肯定应该在"F_"开头key的下面。

接着,我们将字段前方加上前缀"Z_",发现有变化,key下移了,跑到了"FE"开头的key的前面去了。

  • 增加前缀:Z_

继续调整,测试,又变化了:

  • 增加前缀:ZZZZZZZZ_

前缀变成"ZZZZZ_"后,key继续下移,跑到了FE的后面去了。

前后比较,得出规律:同级别key,先按key的长度排序,后按字母顺序排序。

总结

金蝶这个霸王设计的方案肯定不规范,但时间条件下,也难以等到这个大笨象的转身。

最终,我们使用调整字段长度,以固定其顺序的方式来解决顺序,配合字符串的替换来解决字段对应的问题.虽说很蹩脚的方式,但是解决了问题。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
关系型数据库 MySQL Java
【IDEA】java后台操作mysql数据库驱动常见错误解决方案
【IDEA】java后台操作mysql数据库驱动常见错误解决方案
442 0
|
8月前
|
监控 数据挖掘 API
快应用报错Module Error 分包要求 app.json#minPlatformVersion 不小于 1061, 当前值为 21解决方案-优雅草卓伊凡
快应用报错Module Error 分包要求 app.json#minPlatformVersion 不小于 1061, 当前值为 21解决方案-优雅草卓伊凡
219 0
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
2787 82
|
9月前
|
存储 关系型数据库 MySQL
MySQL中实施排序(sorting)及分组(grouping)操作的技巧。
使用这些技巧时,需要根据实际的数据量、表的设计和服务器性能等因素来确定最合适的做法。通过反复测试和优化,可以得到最佳的查询性能。
454 0
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
监控 Java 关系型数据库
Spring Boot整合MySQL主从集群同步延迟解决方案
本文针对电商系统在Spring Boot+MyBatis架构下的典型问题(如大促时订单状态延迟、库存超卖误判及用户信息更新延迟)提出解决方案。核心内容包括动态数据源路由(强制读主库)、大事务拆分优化以及延迟感知补偿机制,配合MySQL参数调优和监控集成,有效将主从延迟控制在1秒内。实际测试表明,在10万QPS场景下,订单查询延迟显著降低,超卖误判率下降98%。
540 5
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
764 3
|
存储 监控 关系型数据库
MySQL自增ID耗尽解决方案:应对策略与实践技巧
在MySQL数据库中,自增ID(AUTO_INCREMENT)是一种特殊的属性,用于自动为新插入的行生成唯一的标识符。然而,当自增ID达到其最大值时,会发生什么?又该如何解决?本文将探讨MySQL自增ID耗尽的问题,并提供一些实用的解决方案。
659 1
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
关系型数据库 MySQL 数据库
一个 MySQL 数据库死锁的案例和解决方案
本文介绍了一个 MySQL 数据库死锁的案例和解决方案。
977 3

热门文章

最新文章

推荐镜像

更多