MySQL更新存放JSON的字段、\“ 轉(zhuǎn)義成 “的問(wèn)題描述
本篇介紹在執(zhí)行MySQL線上變更時(shí)遇到的問(wèn)題,表現(xiàn)為"更新JSON字段時(shí),實(shí)際更新的值與SQL語(yǔ)句中的值不一致,JSON格式錯(cuò)誤",如下;
問(wèn)題描述
處理線上問(wèn)題,需要新插入一條記錄;將原JSON粘貼出來(lái),修改部分字段,然后提交SQL更新語(yǔ)句,原始JSON如下:
{
"playerQualifyType": 1,
"surveyId": 14,
"playerRegisterEndTime": 1670860799000,
"planName": "《碧藍(lán)大陸》先鋒測(cè)試招募!",
"planStatus": 2,
"playerRegisterStartTime": 1669860000000,
"gameName": "碧藍(lán)大陸",
"developerName": "海南羽弘信息技術(shù)有限公司",
"planStartTime": 1673316000000,
"qualificationCodeUrl": "",
"updateTime": 1669777099000,
"planPlayerNum": 1500,
"extend": "{\"innerDesc\":\"\",\"planId\":16,\"verifyOperator\":\"Akira-11126666\",\"verifyResultDesc\":\"\",\"verifyResultDescImgList\":[],\"verifyResultStatus\":2,\"verifyTime\":1669777099887}",
"planEndTime": 1673884800000,
"pkgStatus": 0
}
現(xiàn)提交SQL變更單,執(zhí)行SQL語(yǔ)句如下:
update t set `json_field` =
'
{
"playerQualifyType": 1,
"surveyId": 14,
"playerRegisterEndTime": 1670860799000,
"planName": "《碧藍(lán)大陸》先鋒測(cè)試招募!",
"planStatus": 2,
"playerRegisterStartTime": 1669860000000,
"gameName": "碧藍(lán)大陸",
"developerName": "海南羽弘信息技術(shù)有限公司",
"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;
結(jié)果數(shù)據(jù)庫(kù)中更新后查出來(lái)的紀(jì)錄如下,不滿足JSON格式了,仔細(xì)檢查發(fā)現(xiàn)是extend字段的值中的反斜杠全部沒(méi)有了,JSON解析失敗;
{
"playerQualifyType": 1,
"surveyId": 14,
"playerRegisterEndTime": 1670860799000,
"planName": "《碧藍(lán)大陸》先鋒測(cè)試招募!",
"planStatus": 2,
"playerRegisterStartTime": 1669860000000,
"gameName": "碧藍(lán)大陸",
"developerName": "海南羽弘信息技術(shù)有限公司",
"planStartTime": 1673316000000,
"qualificationCodeUrl": "",
"updateTime": 1669777099000,
"planPlayerNum": 1500,
"extend": "{"innerDesc":"","planId":16,"verifyOperator":"Akira-11126666","verifyResultDesc":"","verifyResultDescImgList":[],"verifyResultStatus":2,"verifyTime":1669777099887}",
"planEndTime": 1673884800000,
"pkgStatus": 0
}

問(wèn)題排查
聯(lián)系DBA描述問(wèn)題,得到的回復(fù)是——
\"相當(dāng)于就轉(zhuǎn)義成 "了,這是MySQL自身處理的結(jié)果;
實(shí)驗(yàn)如下:

而代碼中執(zhí)行的就沒(méi)問(wèn)題,原因是代碼中該字段對(duì)應(yīng)的Java類(lèi)型為String,也就是說(shuō)原JSON的外層因?yàn)樘琢艘粚与p引號(hào)"",因此還會(huì)有一次轉(zhuǎn)義符的嵌套,如下;
\"extend\":\"{\\\"innerDesc\\\":\\\"\\\",\\\"planId\\\":16,\\\"verifyOperator\\\":\\\"Akira-11126666\\\",\\\"verifyResultDesc\\\":\\\"\\\",\\\"verifyResultDescImgList\\\":[],\\\"verifyResultStatus\\\":2,\\\"verifyTime\\\":1669777099887}\"
因此,代碼中執(zhí)行JSON字符串的MySQL插入,實(shí)際入庫(kù)的值與預(yù)期一致;正確的SQL如下:
update t set `json_field` =
'
{\"playerQualifyType\":1,\"surveyId\":14,\"playerRegisterEndTime\":1670860799000,\"planName\":\"《碧藍(lán)大陸》先鋒測(cè)試招募!\",\"planStatus\":2,\"playerRegisterStartTime\":1669860000000,\"gameName\":\"碧藍(lán)大陸\",\"developerName\":\"海南羽弘信息技術(shù)有限公司\",\"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字符串字段時(shí),步驟應(yīng)該如下:
1. 輸入查詢語(yǔ)句,找到目標(biāo)記錄,復(fù)制JSON字段的值到JSON編輯工具中修改JSON中的屬性值
2. 將修改后的JSON粘貼到IDE中,IDE用雙引號(hào)接收這一串JSON;
3. 執(zhí)行SQL時(shí),SQL語(yǔ)句中的值以IDE中被雙引號(hào)包裹的字符串值為SQL中的新的value;
// 將JSON粘貼進(jìn)來(lái) 整體作為SQL更新語(yǔ)句中的新的value 這里也可以不格式化JSON
String formatValue = "{\n" +
" \"playerQualifyType\": 1,\n" +
" \"surveyId\": 14,\n" +
" \"playerRegisterEndTime\": 1670860799000,\n" +
" \"planName\": \"《碧藍(lán)大陸》先鋒測(cè)試招募!\",\n" +
" \"planStatus\": 2,\n" +
" \"playerRegisterStartTime\": 1669860000000,\n" +
" \"gameName\": \"碧藍(lán)大陸\",\n" +
" \"developerName\": \"海南羽弘信息技術(shù)有限公司\",\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" +
"}";
// 未格式化 會(huì)少去/n換行符
String value = "{\"playerQualifyType\":1,\"surveyId\":14,\"playerRegisterEndTime\":1670860799000,\"planName\":\"《碧藍(lán)大陸》先鋒測(cè)試招募!\",\"planStatus\":2,\"playerRegisterStartTime\":1669860000000,\"gameName\":\"碧藍(lán)大陸\",\"developerName\":\"海南羽弘信息技術(shù)有限公司\",\"planStartTime\":1673316000000,\"qualificationCodeUrl\":\"\",\"updateTime\":1669777099000,\"planPlayerNum\":1500,\"extend\":\"{\\\"innerDesc\\\":\\\"\\\",\\\"planId\\\":16,\\\"verifyOperator\\\":\\\"Akira-11126666\\\",\\\"verifyResultDesc\\\":\\\"\\\",\\\"verifyResultDescImgList\\\":[],\\\"verifyResultStatus\\\":2,\\\"verifyTime\\\":1669777099887}\",\"planEndTime\":1673884800000,\"pkgStatus\":0}";
到此這篇關(guān)于MySQL更新存放JSON的字段、\“ 轉(zhuǎn)義成 “的文章就介紹到這了,更多相關(guān)MySQL JSON轉(zhuǎn)義內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql語(yǔ)句查詢用戶權(quán)限過(guò)程詳解
這篇文章主要介紹了mysql語(yǔ)句查詢用戶權(quán)限過(guò)程詳解,授予用戶的權(quán)限可能分全局層級(jí)權(quán)限、數(shù)據(jù)庫(kù)層級(jí)權(quán)限、表層級(jí)別權(quán)限、列層級(jí)別權(quán)限、子程序?qū)蛹?jí)權(quán)限。,需要的朋友可以參考下2019-06-06
mysql 導(dǎo)出select語(yǔ)句結(jié)果到excel文件遇到問(wèn)題及解決方法
這篇文章主要介紹了mysql 導(dǎo)出select語(yǔ)句結(jié)果到excel文件遇到問(wèn)題及解決方法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
Mysql表數(shù)據(jù)比較大情況下修改添加字段的方法實(shí)例
最近遇到的一個(gè)問(wèn)題,需要在一張1800萬(wàn)數(shù)據(jù)量的表中添加加一個(gè)字段,所以這篇文章主要給大家介紹了關(guān)于Mysql表數(shù)據(jù)比較大情況下修改添加字段的方法,需要的朋友可以參考下2022-06-06
MySQL存儲(chǔ)引擎中MyISAM和InnoDB區(qū)別詳解
存儲(chǔ)引擎說(shuō)白了就是如何存儲(chǔ)數(shù)據(jù)、如何為存儲(chǔ)的數(shù)據(jù)建立索引和如何更新、查詢數(shù)據(jù)等技術(shù)的實(shí)現(xiàn)方法。因?yàn)樵陉P(guān)系數(shù)據(jù)庫(kù)中數(shù)據(jù)的存儲(chǔ)是以表的形式存儲(chǔ)的,所以存儲(chǔ)引擎也可以稱(chēng)為表類(lèi)型(即存儲(chǔ)和操作此表的類(lèi)型)2016-12-12
mysql解決時(shí)區(qū)相關(guān)問(wèn)題
這篇文章主要介紹了mysql如何解決時(shí)區(qū)相關(guān)問(wèn)題,本篇文章將從數(shù)據(jù)庫(kù)參數(shù)入手,逐步介紹時(shí)區(qū)相關(guān)內(nèi)容。感興趣的朋友可以了解下2020-08-08

