一尘不染

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

sql

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

因为字符串中有圆括号,所以它不起作用。

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

编辑:根据我的回答(见下文),我确实提出了问题。


阅读 124

收藏
2021-03-08

共1个答案

一尘不染

会回答自己-问题出在“〜”(波浪号)中。

经过详细阐述,有一个有趣的发现:

如果是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驱动程序不知道圆括号是正常字符(例如我的情况)还是模式匹配的分组符号,这些模式将哪些项组合成一个逻辑项。

2021-03-08