gpt4 book ai didi

java - 搜索/插入查询 jdbc 中的反斜杠 (\) 和引号 (')

转载 作者:行者123 更新时间:2023-12-02 10:07:39 25 4
gpt4 key购买 nike

我正在将 JDBC 与 crateb 一起使用(它几乎使用 PSQL 协议(protocol))。碰巧当我尝试执行这样的查询

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 \ 不是转义字符)

  • 最新版本的 Ceratedb 有 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\' ,现在反斜杠正在转义 quote ,因此 quote 被转义
    • 因此 crate jdbc 解析器显示自 ' 以来未终止的字符串被转义了

我正在研究的方法

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

最佳答案

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

问题在于单引号,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 + "'";

关于java - 搜索/插入查询 jdbc 中的反斜杠 (\) 和引号 ('),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55227084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com