服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL更新存放JSON的字段、\“ 转义成 “的问题描述

MySQL更新存放JSON的字段、\“ 转义成 “的问题描述

2022-12-22 16:42七海健人 Mysql

本篇介绍在执行MySQL线上变更时遇到的问题,表现为"更新JSON字段时,实际更新的值与SQL语句中的值不一致,JSON格式错误",本文给大家分享问题描述及解决方案,感兴趣的朋友一起看看吧

本篇介绍在执行MySQL线上变更时遇到的问题,表现为"更新JSON字段时,实际更新的值与SQL语句中的值不一致,JSON格式错误",如下;

问题描述

处理线上问题,需要新插入一条记录;将原JSON粘贴出来,修改部分字段,然后提交SQL更新语句,原始JSON如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
    "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语句如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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解析失败

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
    "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
}

MySQL更新存放JSON的字段、\“ 转义成 “的问题描述

问题排查

联系DBA描述问题,得到的回复是——

\"相当于就转义成 "了,这是MySQL自身处理的结果;

实验如下:

MySQL更新存放JSON的字段、\“ 转义成 “的问题描述

而代码中执行的就没问题,原因是代码中该字段对应的Java类型为String,也就是说原JSON的外层因为套了一层双引号"",因此还会有一次转义符的嵌套,如下;

?
1
\"extend\":\"{\\\"innerDesc\\\":\\\"\\\",\\\"planId\\\":16,\\\"verifyOperator\\\":\\\"Akira-11126666\\\",\\\"verifyResultDesc\\\":\\\"\\\",\\\"verifyResultDescImgList\\\":[],\\\"verifyResultStatus\\\":2,\\\"verifyTime\\\":1669777099887}\"

因此,代码中执行JSON字符串的MySQL插入,实际入库的值与预期一致;正确的SQL如下:

?
1
2
3
4
5
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;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 将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}";

到此这篇关于MySQL更新存放JSON的字段、\“ 转义成 “的文章就介绍到这了,更多相关MySQL JSON转义内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/minghao0508/article/details/128372093

延伸 · 阅读

精彩推荐
  • MysqlMySQL数据库基于sysbench实现OLTP基准测试

    MySQL数据库基于sysbench实现OLTP基准测试

    这篇文章主要介绍了MySQL数据库基于sysbench实现OLTP基准测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    fengzhanhai7342021-03-10
  • Mysqlmysql用户变量与set语句示例详解

    mysql用户变量与set语句示例详解

    这篇文章主要给大家介绍了关于mysql用户变量与set语句的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    jesseyoung10472021-03-16
  • Mysql深入mysql "ON DUPLICATE KEY UPDATE" 语法的分析

    深入mysql "ON DUPLICATE KEY UPDATE" 语法的分析

    本篇文章是对mysql "ON DUPLICATE KEY UPDATE"语法进行了详细的分析介绍,需要的朋友参考下 ...

    MYSQL教程网5522020-01-04
  • Mysql详解如何利用Xtrabackup进行mysql增量备份

    详解如何利用Xtrabackup进行mysql增量备份

    这篇文章主要为大家介绍了如何利用Xtrabackup进行mysql增量备份详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    不想赖床5122022-11-29
  • Mysql关于对mysql语句进行监控的方法详解

    关于对mysql语句进行监控的方法详解

    这篇文章主要给大家介绍了关于对mysql语句进行监控的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需...

    hcb3532020-11-27
  • MysqlMySQL主从搭建(多主一从)的实现思路与步骤

    MySQL主从搭建(多主一从)的实现思路与步骤

    通过MySQL主从配置,可以实现读写分离减轻数据库压力,最近正好遇到这个功能,所以这篇文章主要给大家介绍了关于MySQL主从搭建(多主一从)的实现思路...

    A.Wang11412021-07-13
  • MysqlLinux中 MySQL 授权远程连接的方法步骤

    Linux中 MySQL 授权远程连接的方法步骤

    如果需要远程连接 Linux 系统上的 MySQL 时,必须为其 IP 和 具体用户 进行 授权,本篇文章主要介绍了Linux中 MySQL 授权远程连接的方法步骤,感兴趣的小伙伴...

    斯文败类i2672019-06-22
  • MysqlMySQL 数据库的基础知识

    MySQL 数据库的基础知识

    这篇文章主要介绍了MySQL 数据库的基础知识,它是一类更具体的可以管理数据的软件。但是实现数据库的这个软件,需要用到很多的数据结构,下面来看看...

    吞吞吐吐大魔王8862022-01-20