我正在使用带有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解析器会说出未终止的字符串\
替换为\
,即反斜杠和空格,由于看不见空格,用户看不到任何区别if(value.contains("\\") ){
return value.replace("\\", "\\ ");
}
'dh\''ruv'
这样的值答案 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 + "'";