「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」
前言
前天不是开工嘛,然后刚刚到公司前端说测试环境好像挂了,开工就直接王炸了,找了运维,运维说服务器过年关机了回来发现有个配件坏了,暂时修不好。那我就本地部署一套当测试环境用,我同步了一份生产库到本地,然后问题就来了,之前好好的功能全部出现了问题,因为年前有需求改动,debug了好几遍代码也没有查出问题,然后突然想到MySQL版本不对。
一.问题所在:版本引起的JSON函数导致,本地MySql版本8.0.2,生产环境版本5.0.3
1.先了解一下MySql里的JSON函数
1)JSON_EXTRACT, 使用形式JSON_EXTRACT(json,json_path),从json里提取内容,第一位是存储在数据库里json字符串,第二位是想要提取的内容key,就像在java里从JsonObject里获取相应的值一样,key(value)的形式,而问题就出自这里,而一般单表不会出现问题,出现问题一般是表连接查询的时候,作为取值的key对应的value与其他表做了关联。
先看看简单示例,熟悉一下用法,从[10,20,[30,40]]的json字符串里获取第2个元素,注意这里是从0开始
执行结果:
2.主表和关联表的字段设计以及执行结果
1)主表
2)关联表
3)执行sql
sql_1:select JSON_EXTRACT(json.json_str,"$.fileList") as colum from main_test mian LEFT JOIN json_test json on mian.id=json.extend_id
执行结果:
4)问题出现点,如果MySql版本是5.0.3的那么JSON_EXTRACT后是取出来的值是正常的,但是如果是8.0.2的取出来的值是带“”的,如果取的值作为表连接on后面的其一,那么数据肯定查询不出来
5)针对4)的问题,如果MySql版本是8以上的,使用JSON_EXTRACT时正确的使用方式是 replace(JSON_EXTRACT(json,json_path),'"','')替换掉双引号
小结
针对日常开发中出现代码不动,环境变动产生的bug,特别要注意版本问题,我也是多次的强调过这个问题,但是有时候还是会忘记,还是得多加深记忆才行,之前java版本升级到8,做分布式项目时组与组之间dubbo版本的不同这些都是版本引起的问题。