如何使用JDBC避免MySQL中的反斜杠?

如何使用JDBC避免MySQL中的反斜杠?,mysql,jdbc,escaping,Mysql,Jdbc,Escaping,我想使用JDBC将类似于\mytext的内容插入MySQL数据库。我尝试使用Java字符串替换方法查找所有反斜杠,并将它们转换为双反斜杠。在Java本身中,我必须用一个双反斜杠来避开每个反斜杠,因此在我的理解中,应该是这样的: String sqlProcessed = sqlString.replace("\\", "\\\\") 我使用insert语句将结果字符串发送到数据库,并用如下“单引号”包围: String query = "INSERT INTO table VALUES ('"

我想使用JDBC将类似于
\mytext
的内容插入MySQL数据库。我尝试使用Java字符串替换方法查找所有反斜杠,并将它们转换为双反斜杠。在Java本身中,我必须用一个双反斜杠来避开每个反斜杠,因此在我的理解中,应该是这样的:

String sqlProcessed = sqlString.replace("\\", "\\\\")
我使用insert语句将结果字符串发送到数据库,并用如下“单引号”包围:

String query = "INSERT INTO table VALUES ('" + sqlProcessed + "')";
但是,我没有显示预期的结果,而是在数据库中得到了一个双反斜杠,即,
\\mytext
。另一方面,在没有处理的情况下,只会省略反斜杠,即在数据库中获取
mytext


我做错了什么?

我建议您使用查询参数,而不是使用文本参数进行查询


驱动程序将帮助您将
\

不将值串联到查询字符串中(唯一有效的例外是,如果您需要动态确定表名和列名)

相反,您应该使用参数化(或准备好的)语句:

比如说

try(PreparedStatement PreparedStatement=connection.prepareStatement(
“插入myTable(第1列、第2列、第3列)的值(?,,?)”){
编制报表。设置字符串(1,“值1”);
编制报表。setInt(2,2);
编制报表。设置字符串(3,“值3”);
preparedStatement.executeUpdate();
}
使用准备好的语句将消除对数据库转义的需要(或者驱动程序负责转义,或者参数值以不需要转义的方式发送到服务器),您只需要处理正常的Java字符串转义


作为额外的好处,您可以得到一个可重用的语句,可以使用不同的值执行多次。在大多数数据库系统上(但IIRC不是在默认设置为Connector/J驱动程序的MySQL上),使用准备好的语句可以(通常会)在重用时获得性能优势。

我该怎么做?您是否尝试过替换为“\\\\”(三个反斜杠)?@marekful您的意思是这样的:替换(“\\”,“\\\”?Java不允许这样做,第三个反斜杠被解释为转义引号,这会导致我跳出字符串。谢谢我对JDBC很陌生。。。所以我都是用常规语句完成的。现在我必须重新实现数据库通信的核心。有什么理由不使用PreparedStatement吗?或者我可以完全切换到它们吗?对于DDL,PreparedStatement不是很有用,但除此之外:使用
PreparedStatement
(或者
CallableStatement
存储过程),除非有很好的理由不使用。非常感谢。我以前知道预先准备好的声明,但我不明白它们为什么如此有用。这是相当的努力,但我的代码现在更干净了@MarkRotterVeel在我的情况下,我需要动态创建查询,所以我不能创建准备好的语句。有没有办法解决这个问题?@DhruvPal必须动态创建一个查询太模糊了,并且不排除使用准备好的语句。考虑问一个问题,明确和详细说明你想解决的问题。