标签:MySQL,JSON,转义
本篇介绍在执行MySQL线上变更时遇到的问题,表现为"更新JSON字段时,实际更新的值与SQL语句中的值不一致,JSON格式错误",如下;
问题描述
处理线上问题,需要新插入一条记录;将原JSON粘贴出来,修改部分字段,然后提交SQL更新语句,原始JSON如下:
{
"playerQualifyType": 1,
"surveyId": 14,
"playerRegisterEndTime": 1670860799000,
"planName": "《碧蓝大陆》先锋测试招募!",
"planStatus": 2,
"playerRegisterStartTime": 1669860000000,
"gameName": "碧蓝大陆",
"developerName": "海南羽弘信息技术有限公司",
"planStartTime": 1673316000000,
"qualificationCodeUrl": "",
"updateTime": 1669777099000,
"planPlayerNum": 1500,
"extend": "{\"innerDesc\":\"\",\"planId\":16,\"verifyOperator\":\"Akira-11126666\",\"verifyResultDesc\":\"\",\"verifyResultDescImgList\":[],\"verifyResultStatus\":2,\"verifyTime\":1669777099887}",
"planEndTime": 1673884800000,
"pkgStatus": 0
}
现提交SQL变更单,执行SQL语句如下:
update t set `json_field` =
'
{
"playerQualifyType": 1,
"surveyId": 14,
"playerRegisterEndTime": 1670860799000,
"planName": "《碧蓝大陆》先锋测试招募!",
"planStatus": 2,
"playerRegisterStartTime": 1669860000000,
"gameName": "碧蓝大陆",
"developerName": "海南羽弘信息技术有限公司",
"planStartTime": 1673316000000,
"qualificationCodeUrl": "",
"updateTime": 1669777099000,
"planPlayerNum": 1500,
"extend": "{\"innerDesc\":\"\",\"planId\":16,\"verifyOperator\":\"Akira-11126666\",\"verifyResultDesc\":\"\",\"verifyResultDescImgList\":[],\"verifyResultStatus\":2,\"verifyTime\":1669777099887}",
"planEndTime": 1673884800000,
"pkgStatus": 0
}
'
where id = 55;
结果数据库中更新后查出来的纪录如下,不满足JSON格式了,仔细检查发现是extend字段的值中的反斜杠全部没有了,JSON解析失败;
{
"playerQualifyType": 1,
"surveyId": 14,
"playerRegisterEndTime": 1670860799000,
"planName": "《碧蓝大陆》先锋测试招募!",
"planStatus": 2,
"playerRegisterStartTime": 1669860000000,
"gameName": "碧蓝大陆",
"developerName": "海南羽弘信息技术有限公司",
"planStartTime": 1673316000000,
"qualificationCodeUrl": "",
"updateTime": 1669777099000,
"planPlayerNum": 1500,
"extend": "{"innerDesc":"","planId":16,"verifyOperator":"Akira-11126666","verifyResultDesc":"","verifyResultDescImgList":[],"verifyResultStatus":2,"verifyTime":1669777099887}",
"planEndTime": 1673884800000,
"pkgStatus": 0
}
问题排查
联系DBA描述问题,得到的回复是——
\"相当于就转义成 "了,这是MySQL自身处理的结果;
实验如下:
而代码中执行的就没问题,原因是代码中该字段对应的Java类型为String,也就是说原JSON的外层因为套了一层双引号"",因此还会有一次转义符的嵌套,如下;
\"extend\":\"{\\\"innerDesc\\\":\\\"\\\",\\\"planId\\\":16,\\\"verifyOperator\\\":\\\"Akira-11126666\\\",\\\"verifyResultDesc\\\":\\\"\\\",\\\"verifyResultDescImgList\\\":[],\\\"verifyResultStatus\\\":2,\\\"verifyTime\\\":1669777099887}\"
因此,代码中执行JSON字符串的MySQL插入,实际入库的值与预期一致;正确的SQL如下:
update t set `json_field` =
'
{\"playerQualifyType\":1,\"surveyId\":14,\"playerRegisterEndTime\":1670860799000,\"planName\":\"《碧蓝大陆》先锋测试招募!\",\"planStatus\":2,\"playerRegisterStartTime\":1669860000000,\"gameName\":\"碧蓝大陆\",\"developerName\":\"海南羽弘信息技术有限公司\",\"planStartTime\":1673316000000,\"qualificationCodeUrl\":\"\",\"updateTime\":1669777099000,\"planPlayerNum\":1500,\"extend\":\"{\\\"innerDesc\\\":\\\"\\\",\\\"planId\\\":16,\\\"verifyOperator\\\":\\\"Akira-11126666\\\",\\\"verifyResultDesc\\\":\\\"\\\",\\\"verifyResultDescImgList\\\":[],\\\"verifyResultStatus\\\":2,\\\"verifyTime\\\":1669777099887}\",\"planEndTime\":1673884800000,\"pkgStatus\":0}
'
where id = 55;
解决方案
在更新Mysql表的JSON字符串字段时,步骤应该如下:
1. 输入查询语句,找到目标记录,复制JSON字段的值到JSON编辑工具中修改JSON中的属性值
2. 将修改后的JSON粘贴到IDE中,IDE用双引号接收这一串JSON;
3. 执行SQL时,SQL语句中的值以IDE中被双引号包裹的字符串值为SQL中的新的value;
// 将JSON粘贴进来 整体作为SQL更新语句中的新的value 这里也可以不格式化JSON
String formatValue = "{\n" +
" \"playerQualifyType\": 1,\n" +
" \"surveyId\": 14,\n" +
" \"playerRegisterEndTime\": 1670860799000,\n" +
" \"planName\": \"《碧蓝大陆》先锋测试招募!\",\n" +
" \"planStatus\": 2,\n" +
" \"playerRegisterStartTime\": 1669860000000,\n" +
" \"gameName\": \"碧蓝大陆\",\n" +
" \"developerName\": \"海南羽弘信息技术有限公司\",\n" +
" \"planStartTime\": 1673316000000,\n" +
" \"qualificationCodeUrl\": \"\",\n" +
" \"updateTime\": 1669777099000,\n" +
" \"planPlayerNum\": 1500,\n" +
" \"extend\": \"{\\\"innerDesc\\\":\\\"\\\",\\\"planId\\\":16,\\\"verifyOperator\\\":\\\"Akira-11126666\\\",\\\"verifyResultDesc\\\":\\\"\\\",\\\"verifyResultDescImgList\\\":[],\\\"verifyResultStatus\\\":2,\\\"verifyTime\\\":1669777099887}\",\n" +
" \"planEndTime\": 1673884800000,\n" +
" \"pkgStatus\": 0\n" +
"}";
// 未格式化 会少去/n换行符
String value = "{\"playerQualifyType\":1,\"surveyId\":14,\"playerRegisterEndTime\":1670860799000,\"planName\":\"《碧蓝大陆》先锋测试招募!\",\"planStatus\":2,\"playerRegisterStartTime\":1669860000000,\"gameName\":\"碧蓝大陆\",\"developerName\":\"海南羽弘信息技术有限公司\",\"planStartTime\":1673316000000,\"qualificationCodeUrl\":\"\",\"updateTime\":1669777099000,\"planPlayerNum\":1500,\"extend\":\"{\\\"innerDesc\\\":\\\"\\\",\\\"planId\\\":16,\\\"verifyOperator\\\":\\\"Akira-11126666\\\",\\\"verifyResultDesc\\\":\\\"\\\",\\\"verifyResultDescImgList\\\":[],\\\"verifyResultStatus\\\":2,\\\"verifyTime\\\":1669777099887}\",\"planEndTime\":1673884800000,\"pkgStatus\":0}";
来源:https://blog.csdn.net/minghao0508/article/details/128372093


猜你喜欢
- 本文实例讲述了Python栈的实现方法。分享给大家供大家参考,具体如下:Python实现栈栈的数组实现:利用python列表方法代码如下:#
- 前言最近网站从HTTPS转为HTTP,更换了网址,旧网址做了301重定向,折腾有点大,于是在百度站长平台提交网址,不管是主动推送还是手动提交
- 今天偶尔在一个学习网站技术的地方看到一个教程,关于html代码的,刚看到咱常用到的视频播放器html标签Object,平时用到他的时候都是为
- 批标准化层 tf.keras.layers.Batchnormalization()tf.keras.layers.Batchnormali
- 版本Sublime Text v4.0(4143) 所需软件Sublime Text v4.0(4143)下载地址:https://www.
- 基本介绍Pinia 是 Vue.js 的轻量级状态管理库官方网站:pinia.vuejs.org/pinia和vuex4一样,也是vue官方
- 发现问题在使用pip install下载其他包时,报了错,如图:提示:“You are using pip versio
- 启发式评估法(Heuristic Evaluation)是一种用来发现用户界面设计中的可用性问题从而使这些问题作为再设计过程中的一部分被重视
- 五一在家写的,和大家分享,支持所有浏览器,添加了左侧菜单点击变色效果<!DOCTYPE html PUBLIC "-//W3
- 本篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。注意!虽然这是
- Keyboard Scan Codes (Numerical Order)Keyboard Scan Codes (Numeri
- 原始两张图片:代码运行结果如下。5种算法值哈希算法、差值哈希算法和感知哈希算法都是值越小,相似度越高,取值为0-64,即汉明距离中,64位的
- 前言在我们对DataFrame对象进行处理时候,下意识的会想到对DataFrame进行遍历,然后将处理后的值再填入DataFrame中,这样
- pip install命令默认是用的是python官方源,由于一些客观原因,连接速度很慢,甚至超时中断,到时很多模块安装不上,甚是苦恼!怎么
- 好吧,我承认我是对晚上看到一张合适的票转让但打过电话去说已经被搞走了这件事情感到蛋疼。直接上文件吧。#coding: utf-8'&
- 这篇文章主要介绍了python3.8 微信发送服务器监控报警消息代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 有时候,女神发来一条消息,说约你看电影,她考虑了一下,又撤回了,不约你了…而你又想知道她究竟发了什么,该怎么办?微信防撤回了解一下。环境要求
- 1、下载从如下地址下载mycat的安装包:http://www.mycat.io/2、解压解压下载的安装包3、安装安装mycat
- 1、我的源码在 /home/topsec/Documents/php-7.0.11 ,安装位置在 /usr/local/php7, php.
- 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的