我有一个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 \',... =''附近使用正确的语法。
我不明白为什么。
答案 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的方法。