相关文章推荐
大力的松鼠  ·  Mysql比较日期和时间 - ·  3 周前    · 
豪情万千的上铺  ·  mysql ...·  3 周前    · 
曾经爱过的松树  ·  批量 kill mysql ...·  3 周前    · 
酒量小的薯片  ·  axios ...·  6 月前    · 
没人理的豆芽  ·  asp.net mvc - Using ...·  1 年前    · 
怕考试的签字笔  ·  使用 JavaScript ...·  1 年前    · 
俊秀的啄木鸟  ·  Quick ...·  1 年前    · 
"ruleType" : 3 , "value" : "{\"begin\":\"测试欢迎语\",\"end\":\"测试结束语\",\"template\":[\"6962def-sadfa\"],\"title\":\"标题\"}" , "rate" : 10 "tag" : 1 , "sort" : 2 , "ruleName" : "分流默认路由" "rules" : [ "ruleType" : 1 , "value" : "1533" , "rate" : "" "labelCode" : "red_user" , "sort" : 1 , "tag" : 2 , "ruleName" : "标签路由"

先对JSON压缩

[{"rules": [{"ruleType": 1,"value": "1458","rate": 90},{"ruleType": 3,"value": "{\"begin\":\"测试欢迎语\",\"end\":\"测试结束语\",\"template\":[\"6962def-sadfa\"],\"title\":\"标题\"}","rate": 10}],"tag": 1,"sort": 2,"ruleName": "分流默认路由"},{"rules": [{"ruleType": 1,"value": "1533","rate": ""}],"labelCode": "red_user","sort": 1,"tag": 2,"ruleName": "标签路由"}]

然后就直接

update `shuidi_cs_biz`.`session_sub_route_rule` set rules = '[{"rules": [{"ruleType": 1,"value": "1458","rate": 90},{"ruleType": 3,"value": "{\"begin\":\"测试欢迎语\",\"end\":\"测试结束语\",\"template\":[\"6962def-sadfa\"],\"title\":\"标题\"}","rate": 10}],"tag": 1,"sort": 2,"ruleName": "分流默认路由"},{"rules": [{"ruleType": 1,"value": "1533","rate": ""}],"labelCode": "red_user","sort": 1,"tag": 2,"ruleName": "标签路由"}]' where id = 1;

update 或者 insert 都行, 然后查下更新后的

"rules": [ "ruleType": 1, "value": "1458", "rate": 90 //注意这部分,解析出现问题了 "ruleType": 3, "value": "{" begin ":" 测试欢迎语 "," end ":" 测试结束语 "," template ":[" 6962 def - sadfa "]," title ":" 标题 "}", "rate": 10 }], "tag": 1, "sort": 2, "ruleName": "分流默认路由" "rules": [ "ruleType": 1, "value": "1533", "rate": "" }], "labelCode": "red_user", "sort": 1, "tag": 2, "ruleName": "标签路由"

然后GG了,线上出问题了。

这种问题出现在**,JSON字符串字段,包含一个转义字符串的情况**,如图

解决的办法

第一种: 在压缩字符串后,进行一次转义

[{\"rules\": [{\"ruleType\": 1,\"value\": \"1458\",\"rate\": 90},{\"ruleType\": 3,\"value\": \"{\\\"begin\\\":\\\"测试欢迎语\\\",\\\"end\\\":\\\"测试结束语\\\",\\\"template\\\":[\\\"6962def-sadfa\\\"],\\\"title\\\":\\\"标题\\\"}\",\"rate\": 10}],\"tag\": 1,\"sort\": 2,\"ruleName\": \"分流默认路由\"},{\"rules\": [{\"ruleType\": 1,\"value\": \"1533\",\"rate\": \"\"}],\"labelCode\": \"red_user\",\"sort\": 1,\"tag\": 2,\"ruleName\": \"标签路由\"}]

然后新增,修改就都可以

有第一种,必然有第二种,哈哈哈

1、我用的navicat,直接在工具上,copy as insert statement

2、 然后发现,人家的格式就是转义后的,参考这个维护就行

insert into `shuidi_cs_biz`.`session_sub_route_rule` ( `sub_route_name`, `channel_id`, `rules`, `status`, `is_delete`, `create_time`, `update_time`) values ( '路由', '7', '[{\"rules\": [{\"ruleType\": 1,\"value\": \"1458\",\"rate\": 90},{\"ruleType\": 3,\"value\": \"{\"begin\":\"测试欢迎语\",\"end\":\"测试结束语\",\"template\":[\"6962def-sadfa\"],\"title\":\"标题\"}\",\"rate\": 10}],\"tag\": 1,\"sort\": 2,\"ruleName\": \"分流默认路由\"},{\"rules\": [{\"ruleType\": 1,\"value\": \"1533\",\"rate\": \"\"}],\"labelCode\": \"red_user\",\"sort\": 1,\"tag\": 2,\"ruleName\": \"标签路由\"}]', '1', '1', '2021-07-26 10:25:02', '2022-04-15 11:05:46');

这个问题采坑线上两次了

JSon串在被串行化后保存在文件中,读取字符串时,是不能直接拿来用JSON.parse()解析为JSON  对象的。因为它是一个字符串,不是一个合法的JSON对象格式。例如下面的JSON串保存在文件中,读出来不能直接解析: “{\”resourceId\”:\”dfead70e4ec5c11e43514000ced0cdcaf\”,\”properties\”:{\”process_id\”:\”process4\”,\”name\”:\”\”,\”documentation\”:\”\”,\”processformtemplate\”:\”\”}}” 这个串如果出现在代码中是没有问题的 在JS中快速转义JSON字符串。 手动转义小的JSON字符串比使用本机更快。 主要焦点是非常快速地检查不需要转义的字符串,同时还改善了转义自身或至少不低于JSON.stringify的条件。 运行基准测试( npm run benchmark )显示出以下好处: 节点./基准 JSON short non escaped x 2 , 884 , 878 ops/sec ± 2.25 % ( 95 runs sampled) this short non escaped x 13 , 082 , 026 ops/sec ± 1.47 % ( 93 runs sampled) JSON short full escape 1 x 2 , 768 , 607 ops/sec ± 1.85 % ( 86 runs sampled) this short full es 由于有些数据内容字段格式不固定需要使用json存储,mysql在存储json时,存在中文会把\过滤掉,导致读取的数据有问题, PHP5.4支持JSON_UNESCAPED_UNICODE这个参数,此参数是让中文字符在json_encode的时候不用转义 但在PHP5.3中,就得自己写个函数来实 //json中文处理 function json_encode_mb($array) 一般出现这种toString后json串里面带有转义字符的原因是往jsonObject中直接put了String类型的内容,比如jsonObject.put("key","dddddd")这样最后jsonObject.toString的时候就会吧字符串里的key都加上反斜杠,解决方法很简单jsonObject里不要直接放String类型的内容,要放jsonObject或者JsonArray进去,这样最后toString 的时候出来的就是标准的json格式举个例子把集合转成jsonArray放入jsonObj 本篇介绍在执行MySQL线上变更时遇到的问题,表现为"更新JSON字段时,实际更新的值与SQL语句中的值不一致,JSON格式错误";原因是MySQL对value的转义处理导致; 在 R 中执行一个SQL,涉及到双层JSON,也就是第二层的JSON包含一个转义符,\。用R的RMySQL 执行的时候第二层的转义符号会被去掉怎么办。如果我直接复制 statement 在SQL中可以执行成功。以下是测试数据UPDATE ANALYSIS SET POSITION_LIST = '[{"date":"20150512","listDatePosition":"[{\\"code\\... 从5.7.8开始,MySQL开始支持JSON类型,用于存储JSON数据。JSON类型的加入模糊了关系型数据库与NoSQL之间的界限,给日常开发也带来了很大的便利。这篇文章主要介绍一下MySQLJSON类型的使用,主要参考MySQL手册:https://dev.mysql.com/doc/refman/8.0/en/...... 结论:2、使用phpaddslashes是错误的。因为它不对应mysql或pgsql。PHP官方强烈建议使用对应mysqlmysqli_real_escape_string()和对应PostgreSQL的pg_escape_string()。http://php.net/manual/en/function.addslashes.php3、保存到数据库之前使用htmlspecialchars是... 用[N]代表JSON数组中的第N个元素。序号从0开始。 用[M to N]代表JSON数组中第M个至第N个元素。序号从0开始。 用.[*]通配符代表JSON对象的所有子元素。 用[*]通配符代表JSON数组的所有元素。 用**通配符代表用某字符开头或结尾的元素。 *通配符的查询: mysql> SELECT JSON_EXTRACT('{"a":