【发布时间】:2014-12-18 10:04:08
【问题描述】:
我想创建一个 JDBC PreparedStatement,例如:
SELECT URL,LOCATE ( '?', URL ) pos FROM Links WHERE pageId=? ORDER BY pos ASC
第一个? 是文字,第二个? 是参数。我可以使用CHAR(63) 代替'?',但我认为额外的函数调用会减慢SQL 的执行速度。有什么办法可以逃脱第一个??
编辑:
以下代码测试 dkatzel 的断言,即字符串中的 ? 字符不被视为标记:
public class Test {
public static void main(String[] args) throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:h2:mem:test");
Statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE TABLE Links(URL VARCHAR(255) PRIMARY KEY,pageId BIGINT)");
stmt.executeUpdate("INSERT INTO Links(URL,pageId) VALUES('http://foo.bar?baz',1)");
stmt.executeUpdate("INSERT INTO Links(URL,pageId) VALUES('http://foo.bar/baz',1)");
stmt.close();
PreparedStatement ps = conn
.prepareStatement("SELECT URL,LOCATE ( '?', URL ) pos FROM Links WHERE pageId=? ORDER BY pos ASC");
ps.setLong(1, 1);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString(1) + ":" + rs.getInt(2));
}
rs.close();
ps.close();
conn.close();
}
}
输出:
http://foo.bar/baz:0
http://foo.bar?baz:15
看来 dkatzel 是正确的。我搜索了JDBC Spec,但找不到任何提及?参数标记如果在引号内将被忽略,但我发现的PreparedStatement解析器的少数实现(MySql,c-JDBC,H2 ) 似乎都将单引号内的文本排除在参数标记之外。
【问题讨论】:
-
建议的重复,stackoverflow.com/questions/14779896/… 特别没有解决引号内
?参数标记的问题(在此处询问)。
标签: java sql jdbc prepared-statement