什么字符将PreparedStatement转义?
问题描述:
我注意到,当我使用PreparedStatement
时,它看起来似乎不会转义某些通配符,如'%'或'_'。我知道这些可以使用反斜杠在MySql中转义。这让我想知道,PreparedStatement
会逃离哪些角色?什么字符将PreparedStatement转义?
答
PreparedStatement
不会转义任何东西 - 它依赖于预编译语句的数据库支持。
也就是说,PreparedStatement
决不会用?
s代替参数值,以形成一个文字查询字符串。相反,它使用占位符将查询字符串发送到数据库,并使用数据库支持来绑定查询参数(但可能取决于JDBC驱动程序实现)。
答
在我的测试中,它逃脱了单引号,\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
有趣的是,MySql的支持是什么样的? – stevebot 2010-10-14 15:46:35
MySql支持在服务器端以相同方式准备语句。它在代码中的外观取决于您使用的驱动程序。 – 2010-10-14 15:49:03
我相信很多驱动程序实际上会在SQL文本中插入转义参数文本。 – 2010-10-14 15:54:35