假設我有一個查詢,如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查詢作爲輸入。
我懷疑這個問題一般可以解決。考慮這種情況:'SELECT * FROM my_table WHERE name ='J'onn'||'J'onzz''(是的,火星獵手)你怎麼知道該怎麼做?中間的撇號字符串結束符還是名稱中間有雙管?一個更好的例子可能是[小Bobby Tables](http://xkcd.com/327/)。 – jpmc26
你的意思是你現在要求人們傳入整個SQL,裏面不適合''',現在你想清理SQL?如果是這樣,請放棄,這是不能做到的。例如當你給出一個SQL select * from a where b ='x'或c ='y''時,它也可以解釋爲b =某物表示'x'或c ='y'的東西。在這種情況下,你永遠無法做出適當的消毒。考慮設計你的組件來獲取SQL和要使用的參數(你也可以在Hibernate中執行setParameter) –