【问题标题】:How to escape " ' " in sql如何在sql中转义“'”
【发布时间】:2012-06-13 09:19:02
【问题描述】:

您好,我正在数据库中搜索名称组合。我将组合传递如下

"firstName='" + firstName + "'", "middleName='" + middleName + "'", "lastName='" + lastName + "'"

这很好用。但问题出现在名称中有一些“'”的地方,我该如何纠正它?例如:Johns 或 Jerry 等导致异常

【问题讨论】:

  • 你为什么不尝试使用PreparedStatement?我觉得更好
  • @TuTran 我希望我能多次支持您的评论。发布答案!
  • 忽略这里所有的字符串操作答案,它们仍然容易受到 SQL 注入的影响,这在当今是一个严重的问题。我强烈建议您阅读this
  • @Jaison:抱歉,您原来的帖子没有提到Hibernate!所以我推荐你使用PreparedStatement。有关Hibernate 的解决方案,请参阅我的 anwser
  • 不是我的错误,我将它标记为除休眠之外的 sql。对不起

标签: java sql hibernate


【解决方案1】:

使用preparedStatement对你来说很容易

ps.executeUpdate("INSERT INTO tb_name values(?,?) WHERE id=?");
ps.setString(1,firstName);
ps.setString(2,middleName);
ps.setInt(3,id);
ps.execute();

【讨论】:

    【解决方案2】:

    至少对于MySQL,你必须在前面加上另一个'

    INSERT INTO table (column) VALUES ('this isn''t it');
    

    【讨论】:

    • @Johanna 会转义单引号,但仍然容易受到 SQL 注入的攻击。
    【解决方案3】:

    如果你使用的是 Hibernate,你应该这样使用:

    Query query = session.createQuery("from Something s where s.firstName = :firstName and s.middleName = :middleName and s.lastName = :lastName");
    query.setString("firstName", firstName);
    query.setString("middleName", middleName);
    query.setString("lastName", lastName);
    
    List<?> list = query.list();
    

    希望对您有所帮助! 您可以在herehere 看到更多信息

    【讨论】:

    • 这是最好的hibernate解决方案(认为这不是问题的确切答案,可能有特殊原因他真的需要')
    • 如果在尝试使用 hibernate saveOrUpdate(Object) 保存对象时发生此错误并且单引号位于对象的字段之一的字符串中,如何解决此错误
    【解决方案4】:
        String firstName="X";
        String middleName="Y";
        String lastName="Z";
    
     "firstName='" + firstName + "',middleName='" + middleName + "',lastName='" + lastName + "'";
    

    您可以使用它来获取输出

    firstName='X',middleName='Y',lastName='Z'
    

    【讨论】:

      【解决方案5】:

      您可以通过使用反斜杠 \' 转义 SQL 中的单引号字符 (')。

      【讨论】:

      • 用反斜杠转义不适用于 SQL - 至少在一般情况下。
      • @Johanna MySQL Reference Manual 表示通常使用前面的反斜杠,但也注意双引号功能。换句话说,两者都有效。
      • 这就是它写“一般”的原因。对于 MySQL,反斜杠有效,对于 Oracle,反斜杠无效。 Oracle 只接受双引号 ''
      【解决方案6】:

      试试这个:

      firstName = firstName.replace("'" , "''");
      

      改用 PreparedStatement 会更好。

      【讨论】:

        【解决方案7】:

        我猜以下方法也有效(至少对于 MySQL):

        SELECT login FROM usertable WHERE lastname="O'Neil";
        

        【讨论】:

        • 不适用于 Oracle - 它不起作用 => 所以不要在程序中使用它。
        猜你喜欢
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-28
        • 2011-11-03
        • 1970-01-01
        相关资源
        最近更新 更多