这是我的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();
由于字符串中的圆括号,它无效。
如何在准备好的声明中转义圆括号?
编辑:根据我的回答(见下文),我的答案是正确的。
答案 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中,您无法转义字符串中的括号。