搜索/插入查询jdbc

时间:2019-03-18 17:37:16

标签: java jdbc cratedb

我正在使用带有cratedb的JDBC(几乎使用PSQL协议)。碰巧当我尝试执行这样的查询

String query = "select * from test where col1='dhruv\'";

它给了我解析器异常。

Caused by: io.crate.shade.org.postgresql.util.PSQLException: Unterminated string literal started at position 39 in SQL select * from test where col1='dhruv\'. Expected  char
    at io.crate.shade.org.postgresql.core.Parser.checkParsePosition(Parser.java:1310)
    at io.crate.shade.org.postgresql.core.Parser.parseSql(Parser.java:1217)

然后在调试时,我在jdbc的Parser.java中发现了这段代码

 else if (c == '\'') {
                    i0 = i;
                    i = parseSingleQuotes(p_sql, i, stdStrings);
                    checkParsePosition(i, len, i0, p_sql, "Unterminated string literal started at position {0} in SQL {1}. Expected ' char");
                    newsql.append(p_sql, i0, i - i0 + 1);
                }

正在引起问题。据我了解,它们破坏了char数组中的值,并且在声明的末尾'\''与我的\发生了冲突。

我所知道或尝试过的

  • 我读到人们要求使用prepared statement,因为插入内容也发生了同样的问题,但是我的查询是动态的,所以我不能使用它。

  • 我们不能说不可能在数据库中插入dhruv\之类的值。我们可以直接通过控制台或json文件插入(由于Java需要转义单个\,而db \不是转义字符,这在Java中是很困难的)

  • 最新版本的Cratedb具有String Literals with C-Style Escape,但是仅使用此功能就无法更新整个数据库

那么有没有解决的办法?

++更新

还找到了类似的查询

select * from test where col1='dh\''ruv'

由于同样的原因也将不起作用。

++更多更新

  • 据我所知select * from workkards where w_number='dhruv\\',在运行时将其视为select * from workkards where w_number='dhruv\'
    • 'dhruv\'中,现在反斜杠转义了引号,因此引号被转义了
    • 由于'被转义了,所以crate jdbc解析器会说出未终止的字符串

我正在从事的工作方式

  • 我将Java代码中的\替换为\,即反斜杠和空格,由于看不见空格,用户看不到任何区别
if(value.contains("\\") ){
            return value.replace("\\", "\\ ");
        }
  • 类似于上面的内容,似乎可以正常工作,因为我能够插入值,但是存在一个问题
  • 该值存储在数据库中,带有尾随空格,因此搜索该值时会出现问题
  • 我们可以将相同的逻辑应用于搜索查询,以便其正常工作
  • 一个问题仍然是,如果用户输入'dh\''ruv'这样的值

1 个答案:

答案 0 :(得分:0)

您至少需要转义单引号。据我所知,“ \”反斜杠不需要转义。

问题出在单引号上,crate.io使用它们来显式表示列值,如here

SELECT "field" FROM "doc"."test" where field = '''dhruv\' limit 100;

以上将返回结果(我在本地计算机上运行的示例)。

因此,您的查询将因此需要如下所示(注意使用单引号引起的正确终止):

String query = "select * from test where col1='''dhruv\'";

更新:

然后我建议您是否必须这样做,仅转义“ escapedValue”变量并添加

String query = "select * from test where col1=" + "'" + escapedValue + "'";