首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逃避字符的转义不被接受(Java和MySQL)

逃避字符的转义不被接受(Java和MySQL)
EN

Stack Overflow用户
提问于 2017-11-16 11:17:25
回答 3查看 267关注 0票数 0

我有一个关于MySQL 5.5.58-0+ for 8u 1的语句,如下所示:

代码语言:javascript
复制
UPDATE `general` SET `CUSTOMER_NUMBER` = 'null', `MAINTENANCE_CONTRACT_NR` = '5678', `CONTACT1_NAME` =  + 'ss\' where `general`.`uuid` = '06f8417b-c865-11e7-9a86-000c2924bf92'

我试着逃避\(在ss之后)

代码语言:javascript
复制
string statementEsc = statement.replace('\\', '\\\\');

这导致:

代码语言:javascript
复制
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\”、.= '‘的正确语法。

我不明白为什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-16 11:24:29

你在里面有个流氓加标志。

代码语言:javascript
复制
`CONTACT1_NAME` =  + 'ss\'

因此,此SQL无效:

代码语言:javascript
复制
UPDATE `general` SET `CUSTOMER_NUMBER` = 'null', `MAINTENANCE_CONTRACT_NR` = '5678', `CONTACT1_NAME` =  + 'ss\\' where `general`.`uuid` = '06f8417b-c865-11e7-9a86-000c2924bf92'

建议您在原始字符串中删除它,以便最终得到这个SQL:

代码语言:javascript
复制
UPDATE `general` SET `CUSTOMER_NUMBER` = 'null', `MAINTENANCE_CONTRACT_NR` = '5678', `CONTACT1_NAME` =  'ss\\' where `general`.`uuid` = '06f8417b-c865-11e7-9a86-000c2924bf92'

另一个建议是看看准备好的陈述。我想他们会让你的生活更轻松。

票数 2
EN

Stack Overflow用户

发布于 2017-11-16 11:25:29

您可能通过为我们复制代码而获得了一个+

然而,这是一个使用PreparedStatement的极好机会。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-11-16 14:22:46

虽然使用PreparedStatement是最好的解决方案,但请尝试通过这个类StringEscapeUtils。它为Java、Java脚本、HTML、XML和SQL提供了用于Escape的方法和取消转义字符串的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47328310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档