我有一个关于MySQL 5.5.58-0+ for 8u 1的语句,如下所示:
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接受此查询,但程序会出现错误
在com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:操作中发生了MySQL JDBC驱动程序注册问题: SQL语法出现错误;检查与MySQL服务器版本对应的手册,以获得在“ss\”附近使用的正确语法,`...at第1行SQL更新操作失败: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法出现错误;检查与MySQL服务器版本对应的手册,以获得在第1行使用“ss\”、.= '‘的正确语法。
我不明白为什么。
发布于 2017-11-16 11:24:29
你在里面有个流氓加标志。
`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'另一个建议是看看准备好的陈述。我想他们会让你的生活更轻松。
发布于 2017-11-16 11:25:29
您可能通过为我们复制代码而获得了一个+。
然而,这是一个使用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“。
发布于 2017-11-16 14:22:46
虽然使用PreparedStatement是最好的解决方案,但请尝试通过这个类StringEscapeUtils。它为Java、Java脚本、HTML、XML和SQL提供了用于Escape的方法和取消转义字符串的方法。
https://stackoverflow.com/questions/47328310
复制相似问题