2010-10-14 83 views
5

我注意到,當我使用PreparedStatement時,它看起來似乎不會轉義某些通配符,如'%'或'_'。我知道這些可以使用反斜槓在MySql中轉義。這讓我想知道,PreparedStatement會逃離哪些角色?什麼字符將PreparedStatement轉義?

回答

6

PreparedStatement不會轉義任何東西 - 它依賴於預編譯語句的數據庫支持。

也就是說,PreparedStatement決不會用? s代替參數值,以形成一個文字查詢字符串。相反,它使用佔位符將查詢字符串發送到數據庫,並使用數據庫支持來綁定查詢參數(但可能取決於JDBC驅動程序實現)。

+1

有趣的是,MySql的支持是什麼樣的? – stevebot 2010-10-14 15:46:35

+0

MySql支持在服務器端以相同方式準備語句。它在代碼中的外觀取決於您使用的驅動程序。 – 2010-10-14 15:49:03

+0

我相信很多驅動程序實際上會在SQL文本中插入轉義參數文本。 – 2010-10-14 15:54:35

0

在我的測試中,它逃脫了單引號,\r,\t,\n等等。它的工作原理相當不錯:

String sql = "INSERT INTO test(title) VALUES(?)"; 
PreparedStatement stmt = con.prepareStatement(sql); 
String title = "I'm a \"student\" in a \t (university) \r\n"; 
stmt.setString(1, title); 
stmt.executeUpdate(); 
+0

這可能是特定於您的驅動程序/分貝。正如axtavt提到的,大多數不會自動逃避輸入。 – Leigh 2012-04-09 02:29:48