2009-11-04 92 views
2

我對Java還是有點新,並試圖將數據插入數據庫。插入包含's'的字符串時出現錯誤,因此我的最終結果將是轉義撇號。我該如何完成?用Java轉義撇號

+3

「餅乾的關鍵是撇號」 - FZ – 2009-11-04 21:09:37

回答

5

StringEscapeUtils使用:

StringEscapeUtils.escapeSql(yourstring); 

注意:作爲共享郎3.0:

StringEscapeUtils.escapeSql

這是一個令人誤解的方法,只處理最簡單的可能的SQL案例。由於SQL不是Lang的重點,所以維護這種方法沒有意義。

+0

這就是我正在尋找的。 – jkushner 2009-11-04 19:18:39

+0

雖然我同意使用escapeSql可能會有負面影響,但有些地方已準備好的語句無法正常工作。例如,建立許多行的插入。話雖如此,一些數據庫驅動程序將允許您將許多準備好的語句組合成批處理,然後自動將它們轉換爲單個更有效的語句。知道在什麼時候可以進行一些研究。 – RHSeeger 2013-02-13 02:52:48

0

這取決於您使用的數據庫。通常「有效」(我只對SQL Server有第一手知識)。

您使用的數據庫是?

+0

我用mysql – jkushner 2009-11-04 18:31:26

2

取決於數據庫,但您可以在SqlServer中使用''。

編輯:在MySQL中,你可以使用雙撇號或反斜線:http://www.faqts.com/knowledge_base/view.phtml/aid/630

+0

雙撇號的Postgres – 2009-11-04 18:33:18

+0

我會在評論與詹姆斯同意:使用準備好的語句。更好的長期解決方案。 – 2009-11-04 18:34:29

13

使用準備好的聲明。除了處理任何特殊字符,它們更加強大並且有助於防止SQL注入攻擊。

+1

+1這個答案引發了問題的核心:在方法調用中手工編寫自己的SQL是一種不好的做法,並且會讓您面臨許多安全問題。 – rtperson 2009-11-04 18:34:27

+0

一個很好的習慣,但可能矯枉過正學習語言。 – 2009-11-04 18:34:27

+3

...只要問小鮑比表。 :) – rtperson 2009-11-04 18:35:18

6

這個問題真的不是Java而是底層數據庫。最有可能的是你像這樣串起你的參數:

String sql = "select * from sometable where somefield = " + someObject.getSomeField(); 

不這樣做。改爲使用PreparedStatement

如果這是一個需要關注這些事情的應用程序,那麼它具有防止SQL注入攻擊的附加優勢。

+0

+1:它不僅可以幫助您避免SQL注入攻擊,還可以簡化在SQL語句(Date,InputStream等)中設置Java對象,並且在技術上也更高性能(在DB預編譯)。 – BalusC 2009-11-04 18:54:40

1

我假設您使用的是java.sql.Statement,並使用String調用executeQuery方法。這很糟糕,因爲可以執行SQL注入。您應該使用java.sql.PreparedStatement來代替,然後您可以將任何您想要的字符串設置爲參數,並且您不會遇到問題。

例如:

PreparedStatement pstmt = con.prepareStatement("UPDATE MY_TABLE SET TEXT_FIELD = ?"); 
pstmt.setString(1, "any String 'will work here!");