在前段时间,曾写过一篇关于SQL问题的文章,测试杂谈——一条SQL引发的思考(一)

今天这篇,算是个问题记录吧,问题并不复杂,但对于测试同学而言,确实是个需要关注的点。

问题分析

最近在日常工作中,又遇到一个报错,日志中的具体报错如下:

res=500  en****  Server  Error,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';

好了,以上就是今天的内容了。分析这个问题并不复杂,从中也有些感触,基本功还是需要扎实,一起努力吧。

原文地址:http://www.cnblogs.com/hong-fithing/p/16751067.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性