Java PreparedStatement将转义哪些字符?

Java PreparedStatement将转义哪些字符?,java,jdbc,Java,Jdbc,我注意到,当我使用PreparedStatement时,它似乎不会转义某些通配符,如“%”或“\ux”。我知道这些可以在MySql中使用反斜杠转义。这让我想知道,PreparedStatement将转义哪些字符?PreparedStatement不会转义任何字符-它依赖于数据库对预编译语句的支持 也就是说,PreparedStatement从不将参数值替换为?s以形成文字查询字符串。相反,它将一个带有占位符的查询字符串发送到数据库,并使用数据库支持绑定查询参数(但是,它可能取决于JDBC驱动程序

我注意到,当我使用
PreparedStatement
时,它似乎不会转义某些通配符,如“%”或“\ux”。我知道这些可以在MySql中使用反斜杠转义。这让我想知道,
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();

有趣的是,MySql的支持是什么样子的?MySql在服务器端以同样的方式支持预处理语句。它在代码中的外观取决于您使用的驱动程序。我相信许多驱动程序确实会在SQL文本中插入转义参数文本。@stevebot:Quick Google显示了这一点:@Tom:我认为主要数据库不是这样。这可能是特定于您的驱动程序/db的。正如axtavt提到的,大多数不会自动转义输入。