Java mysql 處理特殊字符% _

sql中經常用like進行模糊查詢,而模糊查詢就要用到百分號“%”,下劃線“_”這些通配符,其中“%”匹配任意多個字符,“_”匹配單個字符。如果我們想要模糊查詢帶有通配符的字符串,如“60%”,“user_name”,就需要對通配符進行轉義,有兩種方式。如下:

1、反斜槓是轉義符,通過反斜槓來轉義%,使其不再是通配符。這裏第一個%是通配符,第二個%不是通配符。

  select percent from score where percent like '%0\%'; 

2、這種是通過escape關鍵字進行轉義,將特定符號後的字符進行轉義,這裏斜槓後面的%就不再是通配符,斜槓之前的%仍然起通配符作用。

select percent from score where percent like '%0/%' escape '/'; 

上面的這些事mysql語句的處理,可是如果我們在Java代碼中,如何將傳入的參數處理成上面的形式呢?

比如我們需要查詢name like "我是%強" 這樣的形式:即Mybatis類似這樣"我是%強"需要作爲參數name傳入:

where name like concat('%', #{name}, '%');。 

直接將name="我是%強"傳入是不行的,sql語句變成 where name like '%我是%強%'。這樣會找到類似name爲:"我是%強","我是強","我是asdf強"……因爲“%”匹配任意多個字符。

方法一:

所以我們就需要在Java中對"我是%強"中的%進行轉義,轉成:"我是\%強"這樣的形式(即上面的第一點)。

所以Java處理方法如下:

name = "我是%強";

name = name.replaceAll("%", "\\\\%");

沒錯,需要用四個反斜杆去處理,最後獲取到的name就是"我是\%強"。這個在sql中就可以直接使用了。

原理:在java 單獨在字符串中使用"\"轉義字符是會報錯的(除非有特殊含義入:\n,\r)。Java中 "\\" 代表"\", 所以要獲取"\%"這樣的字符串,就需要用兩個反斜杆處理,即"\\%"在Java中表示"\%"。可是,要替換字符串中的%又要用到正則去轉義也需要用"\\%"。因此最終要得到"\%" 就必須要四個"\"。其中經過第一次java轉義獲得"我是\\%強",第二次正則轉義獲得"我是\%強"。

上面是處理%號的,下劃線的處理原理與上面的相同。

方法二:

其實網上也有在Java中結合上面的第二種方法進行處理。即

name = "我是%強";

name = name.replaceAll("%", "/%");

但是這種需要每條用了like的sql語句都添加"escape '/'", 這樣太麻煩了。所以推薦使用方法一的方式進行處理。

關注公衆號獲取更多內容,有問題也可在公衆號提問哦:

 

強哥叨逼叨

叨逼叨編程、互聯網的見解和新鮮事

 

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