2

这是我的 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();

由于字符串中的圆括号,它不起作用。

如何在准备好的语句中转义圆括号?

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

4

3 回答 3

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 模式匹配因为使用波浪号标记 JDBC 驱动程序不知道圆括号是普通字符(在我的情况下)还是用于模式匹配的分组符号,将项目分组为一个逻辑项目。

于 2013-01-27T07:13:31.437 回答
0

您可以通过将圆括号放在单引号内来避开圆括号。

于 2013-01-26T16:03:44.647 回答
0

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

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

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

于 2013-01-26T16:19:53.377 回答