如何使用 JDBC 转义 MySQL 中的反斜杠?

How can I escape backslashes in MySQL with JDBC?

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

String sqlProcessed = sqlString.replace("\", "\\")

我使用插入语句发送到数据库的结果字符串,被 'single quotes' 包围,如下所示:

String query = "INSERT INTO table VALUES ('" + sqlProcessed + "')";

但是,我没有显示预期的结果,而是在数据库中得到了一个双反斜杠,即 \mytext。另一方面,如果没有处理,反斜杠就被省略了,即我在数据库中得到 mytext

我做错了什么?

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

driver 会帮你养活 \

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

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

例如

try (PreparedStatement preparedStatement = connection.prepareStatement(
        "insert into myTable (column1, column2, column3) values (?, ?, ?)")) {
    preparedStatement.setString(1, "value1");
    preparedStatement.setInt(2, 2);
    preparedStatement.setString(3, "value3");
    preparedStatement.executeUpdate();
}

使用准备好的语句将消除数据库转义的需要(驱动程序会处理这个,或者参数值以不需要转义的方式发送到服务器),你只需要处理正常的 Java 字符串转义。

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