2009-12-07 130 views
1

ComName是'a'b'c'「def」j Limited。mysql插入和更新查詢中的單引號和雙引號(java)

我想盡前添加\「和「,但執行的結果查詢是

"UPDATE empTable SET empId= '25', ComName = 'a'b'c'"def"j Limited where ID=1" 

我看不到我的內Comname'和\是不是每一個之前存在」和」

這裏是構建列值

columnValue.replaceAll("\'", "\\" + "\'"); 
columnValue.replaceAll("\"", "\\" + "\""); 
columnValue=("'" + columnValue + "'"); 

如何插入這些類型的字符串代碼?

+0

是的,你*必須*使用PreparedStatement做這個,其他的一切只是哭出來了SQL注入攻擊。但是從中可以看出,如果你使用返回值做一些事情,你應該記住'replaceAll()'調用是唯一有用的。字符串是不可改變的,所以忽略新返回的包含新值的字符串意味着你實際上沒有在該行做任何事情。 – 2009-12-07 10:34:39

+0

我明白返回字符串在這裏很重要,我正確使用它的問題是與報價:( – 2009-12-07 10:38:39

回答

1

爲速戰速決,你可以嘗試使用Apache Commons Lang中StringEscapeUtils#escapeSql或同等庫如this one

+0

偉大的API的!!!真正有用的快速修復 – 2009-12-07 12:35:06

+0

只用作快速修復,準備好的語句好得多 – dfa 2009-12-07 12:43:06

+0

我明白了,但是截止日期,項目階段也起着至關重要的作用:) – 2009-12-07 13:39:49

8

查看JDBC庫中的PreparedStatements。例如

PreparedStatement pstmt = con.prepareStatement("update Orders set pname = ? where Prod_Id = ?"); 
pstmt.setInt(2, 100); 
pstmt.setString(1, "Bob"); 
pstmt.executeUpdate(); 

通過使用setString()等也將節省您不必引用字符串。 Here's a tutorial關於如何使用它們。

編輯:由於尼克已經在下面強調,這將節省您不僅僅是從引用問題,但也從SQL注入(安全)問題。

+0

+1 - 有數百篇文章,爲什麼逃脫不只是引入錯誤,但安全缺陷 – 2009-12-07 10:33:49

+0

這裏的實時問題是列名稱,表名都是動態的:(這將真的很難找到正確的列順序和數據類型 – 2009-12-07 10:36:07