当前位置: 首页 > 面试题库 >

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

章永安
2023-03-14
问题内容

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

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

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

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


问题答案:

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

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

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



 类似资料:
  • 问题内容: 我正在尝试将SQL与Python中准备好的语句一起使用。Python对此没有自己的机制,因此我尝试直接使用SQL: 然后,在循环中: 在循环中,我得到: 这是怎么回事? 问题答案: 例如,在http://zetcode.com/db/mysqlpython/上解释了如何在Python中使用MySQL准备好的语句- 在该页面中查找。 在您的情况下,例如: 然后,将其放入循环中: 无需进一

  • 问题内容: 我总是发现很难编写MySQLi预备语句,因为许多函数的工作方式与旧方法不同。现在我面临一个问题。 问题答案: 您正在尝试通过以下方式获取结果 事实并非如此。因为execute将仅返回布尔值。 做喜欢的。

  • 我想知道使用比有什么好处? 最简单的方法是: 如您所见,我可以将数据绑定到< code>preparedStatement而无需< code>boundStatements。< code>boundStatement在哪里有用?

  • VARCHAR 100 VARCHAR 100 VARCHAR 100 [ID][NAME][NICKNAME][FAVORITE_COLOR] 1约翰·约翰尼·瑞德 我尝试的另一个选择是: 这也不起作用,结果集为空。 最后,我尝试了一个不同的SQL,但它显然是错误的,返回了太多的行(因为它不够严格): 所以我的问题是:如何使用Java PreparedStatement使用MySQL“is nu

  • 我正在寻找一种用Java转义MySQL查询的字符串的方法。 但等一下,在你们中的一些人直接下结论说“事先准备好的声明”之前,我想再解释一下。

  • 我有一个搜索查询,它必须使用包含搜索搜索表中的一列。列上有CTXSYS.Context类型索引。当使用prepared语句在表中获取数据时,搜索查询不能处理像-、/、_等特殊字符。