不接受Escape of Escape字符(Java和MySQL)

时间:2017-11-16 11:17:26

标签: java mysql

我有一个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驱动程序已注册 executeUpdate操作出现问题:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在第1行的'ss \',`...附近使用正确的语法 SQL UPDATE操作失败:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在第1行的'ss \',... =''附近使用正确的语法。

我不明白为什么。

3 个答案:

答案 0 :(得分:2)

你那里有一个流氓加号。

`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。我认为他们会让你的生活更轻松。

答案 1 :(得分: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”。

答案 2 :(得分:0)

虽然使用PreparedStatement是最佳答案,但请尝试浏览此课程StringEscapeUtils。它有Escapes和unescapes Strings for Java,Java Script,HTML,XML和SQL的方法。