測試雜談——一條SQL引發的思考(二)

在前段時間,曾寫過一篇關於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';

好了,以上就是今天的內容了。分析這個問題並不複雜,從中也有些感觸,基本功還是需要紮實,一起努力吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章