【问题标题】:Is there way to wrap string with single quotes in Prepared statement setString()?有没有办法在 Prepared 语句 setString() 中用单引号包裹字符串?
【发布时间】:2021-10-07 18:15:49
【问题描述】:

我在一个 MySQL 表中有这个列,它有一个 JSON 字符串,我正在尝试使用正则表达式提取记录。 例如,“paylod”列(数据类型长文本)保存此值

{
"type":"assignment",
"location":"12345"
}

我正在使用 RLIKE 根据位置获取记录。

select * from table where payload RLIKE '"location":"[[:<:]]12345[[:>:]]"';

在 java 中使用此查询时,我使用的是准备好的语句。

String pattern = "\"location\":\"[[:<:]]12345[[:>:]]\""

当我使用preparedStatement.setString(payload, pattern) 时,我没有得到任何结果。但是当我在工作台中执行查询时,我看到了获取的行。

我猜是因为我使用的是 setString,它是用双引号括起来的模式,而 MySQL 无法解析它。

那么有前进的道路吗?我的要求是根据 JSOn 有效载荷列中的键值对获取记录。

【问题讨论】:

    标签: java mysql sql jdbc prepared-statement


    【解决方案1】:

    好的,在字符串中添加转义字符有帮助。

    String pattern = "'\"location'\":'\"[[:<:]]12345[[:>:]]'\"";
    
    String patternValue = pattern.replaceAll("'","\\\\");
    

    所以字符串变成\"location\":\"[[:&lt;:]]12345[[:&gt;:]]\",其中\充当mysql中“的转义字符,当字符串被包裹在”中时

    【讨论】:

    • 对我来说这听起来像是驱动程序中的错误。考虑将其报告给 MySQL/Oracle。顺便说一句:你为​​什么在这里使用替换?您可以自己立即在字符串中插入反斜杠。
    • 如果我在字符串中插入反斜杠,Java不将它们视为字符串转义字符吗?
    • replaceAll 中的第二个字符串还能如何工作?如果您想在字符串 literal 中使用单个反斜杠,则需要使用两个反斜杠(一个表示转义,第二个表示需要生成反斜杠)。顺便说一句,在replaceAll 中,考虑到正则表达式替换的工作原理,您需要 4 个反斜杠来生成一个反斜杠。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多