【问题标题】:fetch records with apostrophe in mysql using LIKE query使用 LIKE 查询在 mysql 中获取带撇号的记录
【发布时间】:2016-06-13 19:10:01
【问题描述】:

我有这样的MYSQL查询

String query="select DISTINCT sctName from snomedicd10map where sctName Like '" + search + "%" + "' LIMIT 5 ";

此查询用于自动完成,如果我在输入 Apostrophe(') 空点异常时搜索 code's 、girl's 等单词

我该如何克服这一点。当用户在文本字段中使用 Apostrophe(') 输入名称时,它应该获取结果。

我已经从 mysql 数据库中获取结果。

我怎样才能做到这一点。

【问题讨论】:

  • 您可以使用" 而不是',您可以转义它们(例如\'),或者您可以通过将查询设置为参数化查询并传递字符串末尾附加% 作为参数。
  • stackoverflow.com/a/1812920/4421474 尝试使用准备好的语句作为最佳实践
  • @Uueerdo 我试图改变它显示相同的错误你会像这样改变上面的查询
  • 我对Java不是很熟悉,我提供的转义序列可能是错误的(正如下面喜马拉雅的回答所暗示的那样)。
  • 你真的应该使用prepared statement,并通过prepared statement设置参数,然后你就不需要自己逃跑了。

标签: java mysql jdbc sql-like apostrophe


【解决方案1】:

通常,当您对名称进行硬编码时,您可以重复和转义

Select * from Students where name like 'John O''Neal' 

如果您使用它们清理字符串或使用参数化查询。查看准备好的语句。

【讨论】:

  • 我没有硬编码列中的名称和值包含那样的内容,我无法将每个名称都更改为那样,并且有 1000 个值
  • 在 Java 中应该有一些可用的替换功能,可以让您在 search 变量中将 ' 替换为 ''类似于 search = replace(search, "'", "''") + "%"; 的东西应该会给你一个可用的搜索变量。
  • @teachme 实际上,忽略上述情况,在此之前需要时间将' 替换为''(否则' 将不在搜索变量中)。跨度>
  • @Uueerdo 感谢人。我已更改为准备好的语句,并且工作正常。
  • @Uueerdo 这是个坏建议,OP 应该使用 PreparedStatement 而不是自己修改值。
【解决方案2】:

您应该使用PreparedStatement,因此它会为您处理转义。例如:

try (PreparedStatement pstmt = Connection.prepareStatement("select DISTINCT sctName from snomedicd10map where sctName Like concat(?, '%') LIMIT 5") {
    pstmt.setString(1, search);
    try (ResultSet rs = pstmt.executeQuery()) {
        // process result
    }
}

或者(在代码中处理通配符):

try (PreparedStatement pstmt = Connection.prepareStatement("select DISTINCT sctName from snomedicd10map where sctName Like ? LIMIT 5") {
    pstmt.setString(1, search + "%");
    try (ResultSet rs = pstmt.executeQuery()) {
        // process result
    }
}

JDBC 驱动程序会自动处理转义(或以不需要转义的方式发送参数)

【讨论】:

  • 是的,我只是后来才这样做,感谢您的宝贵回答。
  • sctName Like ? || '%' 中的 || 在 Java 中是否有特殊作用?因为我认为这不起作用,相当于 MySQL 中的原始查询。
  • 那是SQL标准的字符串连接,可能MySQL用+代替。
  • 我几乎总是使用 MySQL 的 CONCAT(item1, item2, ...) 函数;它总是让我在 MSSQL 中搞砸,因为 SSMS 直到我做了 10 条这样的语句并且必须将它们改回 + 表达式时才警告我。 (编辑:刚刚确认了+|| 在MySQL 中的两个字符串上使用了0... 因为它将它们都转换为数字。例如,'a' + '12b' 将给出12。) ...MSSQL 似乎也不喜欢||
  • 谢谢,一旦我在一台真正的计算机上,我会进行编辑以反映这一点。
【解决方案3】:

这是我在原始评论中的建议,您是否尝试过?

String query="select DISTINCT sctName from snomedicd10map where sctName Like '" 
            + search.replaceAll("'", "\'") + "%' LIMIT 5 ";

【讨论】:

  • 这是个坏建议,OP 应该使用 PreparedStatement 而不是自己修改值。
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
相关资源
最近更新 更多