在前段时间,曾写过一篇关于SQL问题的文章,测试杂谈——一条SQL引发的思考(一) 。
今天这篇,算是个问题记录吧,问题并不复杂 , 但对于测试同学而言,确实是个需要关注的点 。
问题分析最近在日常工作中 , 又遇到一个报错,日志中的具体报错如下:
res=500en****ServerError,error trace StatementCallback; bad SQL grammar [UPDATE dep SET h = CONCAT('test San’Zhang', substring(path, 16)) WHERE h LIKE 'test San'Zhang|%' and id = '12345678']; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Zhang|%' and id = '12345678'' at line 1
将报错核心点提取,就是个SQL报错,来看具体SQL , 如下所示:
UPDATE dep SET h = CONCAT('test San’Zhang', substring(path, 16)) WHERE h LIKE 'test San'Zhang|%' and id = '12345678';
看到这里,对于SQL基本功扎实的朋友,应该已经看出问题所在了 。
看到这个问题后 , 分别找了研发和测试同学 。找研发是让排查问题的根因,为啥能存进这样的数据;找测试是想考察下 , SQL的基本功(带领的测试同学我没面过) 。
得到的结果,还真有点震惊到我了,只能说“同志还需努力呀?。。。。?
好了,回到正题上来吧 。这个SQL如日志里的报错,就是个语法问题:bad SQL grammar
。但到底是哪里有问题呢?
就是like语句这里 h LIKE 'test San'Zhang|%'
, test San'Zhang 中的单引号没有转义成功 , 导致在完整的SQL语句中,后半部分被截断,最终整个SQL报错 。
这个只是SQL层面的问题,但根因是啥,还得研发同学解决 。
解决方案转义最好的处理方式,就是在代码层面上,将英文的单引号做转义处理 , 这样就可以避免掉这种报错了
SQL如下:
UPDATE dep SET h = CONCAT('test San’Zhang', substring(path, 16)) WHERE h LIKE 'test San’Zhang|%' and id = '12345678';
条件值用英文双引号另外一种方式,就是将like条件值用英文双引号,这样就避免了被截断的问题
SQL如下:
UPDATE dep SET h = CONCAT('test San’Zhang', substring(path, 16)) WHERE h LIKE "test San'Zhang|%" and id = '12345678';
好了,以上就是今天的内容了 。分析这个问题并不复杂,从中也有些感触,基本功还是需要扎实,一起努力吧 。
【二 测试杂谈——一条SQL引发的思考】
推荐阅读
- 原神3.1百人一揆第二天人间之证明怎么用试用角色拿2000分
- 明日方舟铅踝精二专三材料需求要哪些
- 2021年二月份的天气预报_2021年二月份天气怎么样
- Morris 遍历实现二叉树的遍历
- iPhone13系列续航排名_iPhone13系列续航测试
- 二 『现学现忘』Git后悔药 — 33、revert撤销
- 怎么在淘宝投诉卖家(淘宝小二最怕投诉电话)
- Idea运行支付宝网站支付demo踩坑解决及其测试注意事项
- 二 kafka详解--kafka为什么快
- 二 路径分析—PostgreSQL+GeoServer+Openlayers