【问题标题】:How to add a string containg a double quote to a sql database?如何将包含双引号的字符串添加到 sql 数据库?
【发布时间】:2014-09-02 02:20:12
【问题描述】:

我想使用 JDBC 向我的 sql 数据库中添加一个字符串。但问题是,只要字符串包含双引号,sql 命令的解释就会完全不同,并且会抛出“您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法” 。”

例如, String ssql = "INSERT INTO tableName VALUES (\""+ string + "\")";

如果 string = "abc",则 sql = INSERT INTO tableName VALUES ("abc")
但是如果 string = "ab\"cd",那么 sql = INSERT INTO tableName VALUES ("ab"c")


因此对于包含双引号的字符串,sql 命令的解释完全不同。

如何将这样的字符串添加到数据库中。

附言。我不能将双引号更改为单引号。并且可以有其他技巧来添加这样的字符串,但我想知道是否真的没有直接添加这样的字符串的方法。

【问题讨论】:

标签: mysql sql database jdbc


【解决方案1】:

您需要对字符串值进行转义以在查询中生成字符串文字。

当你使用引号来分隔字符串时:

  • 字符串中的反斜杠 (\) 应替换为两个反斜杠。

  • 字符串中的引号 (") 应替换为反斜杠和引号。

如果您使用撇号 (') 来分隔字符串(这在 SQL 中更常见),您将转义撇号而不是引号。

如果可能,您应该使用参数化查询,而不是将值连接到查询中。

【讨论】:

    【解决方案2】:

    您遇到了良性 SQL 注入。幸运的是string 不是Little Bobby Tables

    相反,您应该使用像INSERT INTO tableName VALUES (?) 这样的参数化查询,并通过参数发送string 的值。

    有关更多详细信息,请参阅http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html 的 JDBC 文档


    现在,回答这个问题:假设字符串不是来自用户源,而是您尝试自己编写查询,您可以在连接之前将字符串中的 " 替换为 \"

    【讨论】:

      【解决方案3】:

      根据MySQL Spec,它将\" 识别为转义双引号。你也可以使用两个双引号 "" 来转义双引号 " 字符

      \" 双引号 (“"”) 字符

      【讨论】:

        【解决方案4】:

        改一下

        String ssql = "INSERT INTO tableName VALUES (\""+ string + "\")";

        String ssql = "INSERT INTO tableName VALUES ('"+ string + "')";
        

        或者用这样的 PreparedStatement 来简化它

        String ssql = "INSERT INTO tableName VALUES (?)";
        preparedStatement.setString(1,"string");
        

        当你想插入双引号时,你需要像这样对它们进行转义

        String ssql = "INSERT INTO tableName VALUES (?)";
        preparedStatement.setString(1,"\"string\"");
        

        这将在表中插入"string"

        【讨论】:

          【解决方案5】:

          我尝试通过转义双引号来添加字符串,但这不起作用。我可以添加字符串的唯一方法是使用 PreparedStatement 而不是 Statement 类。

          String string = "abc\"abc";
          String sql = "INSERT INTO tableName VALUES(?)";
          
          connection = DriverManager.getConnection(DB_URL, USER, PASS);
          preparedStatement = connection.prepareStatement(sql);
          preparedStatement.setString(1, string);
          preparedStatement.executeUpdate();
          

          此代码段成功地将包含双引号的字符串添加到数据库中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-08-17
            • 1970-01-01
            • 2017-01-26
            • 1970-01-01
            • 1970-01-01
            • 2011-04-23
            相关资源
            最近更新 更多