當項目使用mysql並對字段進行模糊搜索時,如果系統對字段的字符沒有做到限制,就會經常出現用戶輸入下划線‘_’、百分號‘%’此類通配符進行搜索,如此執行往往會檢索到錯誤的結果集,下滑線‘_’會匹配單個任意字符,百分號‘%’會匹配任意個任意字符。
為了方便理解。for example: 在使用like進行模糊匹配時,常規寫法為:field like CONCAT('%',變量,'%')
那么結果為: field like ‘%關鍵字%’,此時搜索出的結果是正確的。
那么問題來了,當用戶輸入單個‘_’,此時執行的語句就是 field like ‘%_%’ , 此時匹配的結果就是整張表的全部數據。
或者這樣:
field like ‘%%%’ ,結果可想而知
解決方案
一,使用INSTR替換like
INSTR不會識別通配符,只會判斷第二個字符串參數在第一個字符串中是否存在。確保此論是有據可依的,上官網。

這里只是說明了該函數會將第二個參數在第一個參數第一次出現的首字母索引位置。通過廣大網友的文檔翻閱中發現該函數用於where字句中即可達到模糊查詢的效果。
使用:
select * form users where INSTR(users_name,‘用戶輸入’) 等同於 select * from users where users_name like CONCAT('%','用戶輸入','%'),簡單來說,INSTR就相當於java中的 string.contains("")方法
二,使用轉義字符‘\’
'\%'會被轉義為‘%’,同理‘\_’會被轉義為‘_’,在你的編程語言過濾用戶輸入的值,遇到通配符就在前面填上‘\’
三,使用ESCAPE轉義
使用(這個用的不熟,暫且舉個例子吧)

這種寫法的含義是字符‘/’后面的字符都被當成是普通字符,而不再是通配符,這樣的做法回有問題,最后一個‘%’應該是被當做通配符處理才是正確的。