mysql - 如何使用 JDBC 在 MySQL 中转义反斜杠?

标签 mysql jdbc escaping

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

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

我使用插入语句发送到数据库的结果字符串,用“单引号”括起来,如下所示:

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

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

我做错了什么?

最佳答案

不要将值连接到查询字符串中(唯一有效的异常(exception)是您需要动态确定表名和列名)。

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

例如

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 不在具有 Connector/J 驱动程序默认设置的 MySQL 上),使用准备好的语句在重用时可以(并且通常会)具有性能优势。

关于mysql - 如何使用 JDBC 在 MySQL 中转义反斜杠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31861921/

相关文章:

java - 如何避免 "One Big Application User"模型?

xml - Oracle 的 EXTRACT 函数是否打破了 XMLELEMENT 中的 NOENTITYESCAPING?

php - MySQL连接返回冗余数据

java - Glassfish 4.1 + Hibernate 5.2 连接

php - 从 id 中检索用户信息

postgresql - 在 JDBC 中,我如何知道 FETCH 何时结束?

python - 如何自动转义 Python 字符串中的控制字符

mysql - 如何连接表以便包含没有匹配项的行?

java - 如何通过托管 bean 显示 MySQL 数据?