下劃線和百分號在sql模糊查詢like語句中爲特殊字符,分別可匹配1個字符和0到多個字符,若是須要真正查詢特殊字符得轉義,如like 'a\_b%' escape '\',將匹配前3個字符爲a_b的全部記錄。java
1、PreparedStatement處理sql
廣泛作法,拼sql時使用like ?,左模糊在查詢條件字符串左側添加%,右模糊在查詢條件字符串右側添加%,對特殊字符進行預先轉義數據庫
condition = condition.replaceAll("_", "\\\\_");oracle
condition = condition.replaceAll("%", "\\\\%");app
ps.setString(idx, "%" + conditon + "%");post
爲何replaceAll中須要使用4個\可參考jdk源碼Matcher.appendReplacement方法。spa
專業作法,拼sql時使用like ? escape '\'(java中使用兩個\\)字符串
2、多數據庫支持處理源碼
在postgres中escape須要使用'\\'(java中使用四個\\)處理it
3、其餘思考
查找數據庫是否有配置模糊查詢的默認轉義字符,搜索未果,可能關鍵字抽取有問題,試圖在oracle的v$parameter中查找會話相關參數可是沒有收穫。
建議處理方式:在sql中like後添加escape,可是不對原始輸入條件進行轉換,用戶可在查詢條件中使用轉義字符查詢特殊字符也能夠進行中間模糊查詢,如輸入'a%b','a\%b'。