測試雜談——一條SQL引發的思考(二)
- 2022 年 10 月 18 日
- 筆記
- SQL Server, 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';
好了,以上就是今天的內容了。分析這個問題並不複雜,從中也有些感觸,基本功還是需要紮實,一起努力吧。