带有JDBC准备语句的字符串中的圆括号

时间:2013-01-26 15:15:24

标签: java sql jdbc parameters prepared-statement

这是我的Java JDBC代码(例如修改和简化):

ps = connection.prepareStatement("SELECT a,b,c FROM mytable WHERE category ~ ?");
ps.setString(1, "my/super/category/abc(def");
                                      ^
                                      |
    +---------------------------------+
    |
//this character is problem
result = ps.executeQuery();

由于字符串中的圆括号,它无效。

如何在准备好的声明中转义圆括号?

编辑:根据我的回答(见下文),我的答案是正确的。

3 个答案:

答案 0 :(得分:3)

会自己回答 - 问题在于“〜”(代号)。

经过一番阐述后,有一个有趣的发现:

当SQL代码为此时(请参阅SQL代码中的“相等”标记):

ps = connection.prepareStatement("SELECT a,b,c FROM mytable WHERE category = ?");

不需要逃避。但是当SQL代码是这样的时(参见SQL代码中的“代字号”标记):

ps = connection.prepareStatement("SELECT a,b,c FROM mytable WHERE category ~ ?");

如果有特殊字符,你需要进行转义,在这种情况下是“(”或“)”:

ps.setString(1, "super/category/abc(def".replaceAll("\\(", "\\\\(")));

这是因为模式匹配:PostgreSQL Pattern Matching因为使用波形标记JDBC驱动程序不知道圆括号是否是正常字符(如我的情况)或模式匹配的分组符号将项目分组为一个逻辑项。

答案 1 :(得分:0)

您可以将圆括号放在单引号内。

答案 2 :(得分:0)

我认为问题是查询没有返回结果,因为它需要在括号前设置转义字符,它可以通过

完成
ps.setString(1, "my/super/category/abc\\(def");

SQL语法允许在字符串中包含转义字符。在Java中,您无法转义字符串中的括号。