2013-08-30 90 views
1

假設我有一個查詢,如SELECT * FROM my_table where name = 'Debbie O'Brian'。正如你可能在SQL Server中所知道的那樣,我們只需要放入另一個'就可以忽略單引號。這是我喜歡自動完成的。處理字符串中的撇號

簡而言之,我需要用兩個包含'之間的''替換所有出現的'。 這是我到目前爲止有:

String text = "SELECT * FROM my_table where name = 'Debbie O'Brian'"; 
String[] splitArray = text.split(" '"); 
for (int i = 0; i < splitArray.length; i++) { 
    String str = splitArray[i]; 
    if (str.endsWith("'")) 
     str = str + " "; 

    // replace all single quotes 
    str = str.replace("'", "''"); 

    // revert last replacement 
    str = str.replace("'' ", "' "); 

    splitArray[i] = str; 
} 

StringBuilder builder = new StringBuilder(); 
for (int i = 0; i < splitArray.length; i++) { 
    builder.append(splitArray[i]).append(" '"); 
} 
System.out.println(builder.substring(0, builder.length() - 2).toString()); 

的問題是,我依靠空白的存在開始'之前。我的問題是,如果沒有這個預設,我該如何做到這一點? 任何幫助(甚至算法的建議)非常感謝。請注意查詢中可能有多個單引號字符串。

編輯:我使用Hibernate來執行本機SQL並獲取整個SQL查詢作爲輸入。

+3

我懷疑這個問題一般可以解決。考慮這種情況:'SELECT * FROM my_table WHERE name ='J'onn'||'J'onzz''(是的,火星獵手)你怎麼知道該怎麼做?中間的撇號字符串結束符還是名稱中間有雙管?一個更好的例子可能是[小Bobby Tables](http://xkcd.com/327/)。 – jpmc26

+2

你的意思是你現在要求人們傳入整個SQL,裏面不適合''',現在你想清理SQL?如果是這樣,請放棄,這是不能做到的。例如當你給出一個SQL select * from a where b ='x'或c ='y''時,它也可以解釋爲b =某物表示'x'或c ='y'的東西。在這種情況下,你永遠無法做出適當的消毒。考慮設計你的組件來獲取SQL和要使用的參數(你也可以在Hibernate中執行setParameter) –

回答

0

OK,就像我上面提到的,我的問題是不SQL注入。我之後所做的,在這一點上似乎是不可能的,除非我實現了一個顯然太多的需求的SQL解析器。所以我會堅持我的預設,並放棄嘗試修正錯誤的意見,因爲兩個人在評論中提到。

謝謝大家的回答。

4

在SQL查詢中處理單引號和其他特殊字符的最佳方法是使用參數化查詢。它也更安全。我會建議在'SQL注入'上進行搜索。這將教你如何防止和處理你的查詢中的單引號。

4

如果使用JDBC使用

PreparedStatement ps = conn.prepareStatement("SELECT * FROM my_table where name = ?") 
ps.setString(1, name); 
+0

我正在從用戶那裏得到整個查詢,並且應該返回結果。所以這不能成爲我的答案。 –

1

當你正在使用Hibernate,類似於@BOB所述使用參數化查詢:

String queryString = "SELECT * FROM my_table where name = :name"; 
    Query query = getSession().createSQLQuery(queryString); 
    query.setString("name", name);