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

在前段時間,曾寫過一篇關于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引發的思考】

    推薦閱讀