【问题标题】:Java MySQL special characters in IN clauseIN子句中的Java MySQL特殊字符
【发布时间】:2015-03-03 22:26:57
【问题描述】:

大家好,

我正在使用 Java 在执行时组装一个查询字符串,该字符串应该作为准备好的语句在数据库上执行。由于我事先不知道 IN 子句中的参数数量,因此我不能使用固定参数(又名“?”字符),因此我将 IN 子句序列创建为 Java 中的字符串并在我的代码中替换它,例如所以:

String statement = SQLUpdates.MYUPDATESTRING.replace("#INCLAUSE#", inList);

但是,变量 inList 中的字符串序列包含几个特殊字符,它们似乎破坏了我的选择,众所周知的是数字符号字符 (#)。有没有办法可以在 Java 或我的 SQL Select String 中转义那些?我不认为我可以在 IN 子句之后使用 ESCAPE 子句,那么我的选择是什么?

【问题讨论】:

    标签: java mysql sql escaping special-characters


    【解决方案1】:

    原来我不得不用反斜杠转义一些特殊字符。引起麻烦的字符是数字符号(#)和反斜杠()。

    我使用的替换代码如下:

    for (String key : keySet) {
       String key2 = key.replaceAll("\\\\", "\\\\\\\\");
       key2 = key2.replaceAll("#", "\\\\#");
       keyString.append("\"").append(key2).append("\"").append(", ");
    }
    

    FOR 循环内的第一行用转义的双反斜杠 (\) 替换所有出现的反斜杠。请注意,反斜杠必须重复多次,因为您必须在 Java 中将其转义一次,然后再为正则表达式转义一次。因此,一个反斜杠变成了四个反斜杠(转义了两次),而一个双反斜杠变成了八个反斜杠。相信我,它有效。

    select 中的第二行转义了数字符号,这是 MySQL 中的 cmets。这是在之后完成的,因为我们不想转义用于转义数字符号的反斜杠。

    最后一行简单地连接字符串,使其看起来像一个逗号分隔的列表,其中每个元素都用双引号括起来,例如:“1”、“2”、“3”等,最后一个逗号之后被删除。随后,最终列表将插入到选择中的适当位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-16
      • 2016-03-01
      • 1970-01-01
      • 2010-10-17
      • 2012-09-08
      • 1970-01-01
      • 2010-10-12
      • 2019-02-09
      相关资源
      最近更新 更多