2010-10-14 40 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