【问题标题】:Escape of Escape character not accepted (Java and MySQL)不接受转义字符的转义(Java 和 MySQL)
【发布时间】:2018-04-29 21:53:09
【问题描述】:

我有一个关于 MySQL 5.5.58-0+deb8u1 的声明,如下所示:

UPDATE `general` SET `CUSTOMER_NUMBER` = 'null', `MAINTENANCE_CONTRACT_NR` = '5678', `CONTACT1_NAME` =  + 'ss\' where `general`.`uuid` = '06f8417b-c865-11e7-9a86-000c2924bf92'

我尝试用

转义\(在ss之后)
string statementEsc = statement.replace('\\', '\\\\');

这会导致:

UPDATE `general` SET `CUSTOMER_NUMBER` = 'null', `MAINTENANCE_CONTRACT_NR` = '5678', `CONTACT1_NAME` =  + 'ss\\' where `general`.`uuid` = '06f8417b-c865-11e7-9a86-000c2924bf92'

手动尝试查询时,MySQL 接受此查询,但程序报错

已注册 MySQL JDBC 驱动程序 执行更新操作时出现问题:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'ss\'、`...第 1 行附近使用的正确语法 SQL UPDATE operation has failed: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have a error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'ss\', ... = '' 附近使用正确的语法。

我不明白为什么。

【问题讨论】:

  • 你会得到它的排序。 (带着浓重的德国口音)“祝你好运”。对不起。忍不住了。

标签: java mysql


【解决方案1】:

虽然使用 PreparedStatement 是最佳答案,但请尝试通过此类 StringEscapeUtils。它具有用于 Java、Java Script、HTML、XML 和 SQL 的 Escapes 和 unescapes Strings 的方法。

【讨论】:

    【解决方案2】:

    你有一个 + 可能来自为我们复制代码。

    不过,这是使用 PreparedStatement 的绝佳机会。

    String sql = "UPDATE `general` SET `CUSTOMER_NUMBER` = 'null', "
            + "`MAINTENANCE_CONTRACT_NR` = ?, `CONTACT1_NAME` = ? WHERE `general`.`uuid` = ?";
    try  (PreparedStatement stmt = connection.prepareStatement(sql)) {
        stmt.setInt(1, 5678);
        stmt.setString(2, "ss\\"); // One backslash
        stmt.setString(3, "06f8417b-c865-11e7-9a86-000c2924bf92");
        stmt.executeUpdate();
    }
    

    顺便说一句,= 'null' 会为该字段分配一个字符串“null”。

    【讨论】:

      【解决方案3】:

      你在那里有一个流氓加号。

      `CONTACT1_NAME` =  + 'ss\'
      

      因此该 SQL 无效:

      UPDATE `general` SET `CUSTOMER_NUMBER` = 'null', `MAINTENANCE_CONTRACT_NR` = '5678', `CONTACT1_NAME` =  + 'ss\\' where `general`.`uuid` = '06f8417b-c865-11e7-9a86-000c2924bf92'
      

      建议你在原来的字符串中去掉它,这样你就可以用这个 SQL 代替:

      UPDATE `general` SET `CUSTOMER_NUMBER` = 'null', `MAINTENANCE_CONTRACT_NR` = '5678', `CONTACT1_NAME` =  'ss\\' where `general`.`uuid` = '06f8417b-c865-11e7-9a86-000c2924bf92'
      

      另一个建议是查看Prepared Statements。我认为它们会让您的生活更轻松。

      【讨论】:

      • 很抱歉给您带来如此明显的错误。不过,使用phpadmin的SQL查询工具,查询成功。这就是为什么我认为语法是正确的。我一定会研究 Prepared Statements,谢谢。
      猜你喜欢
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多