如何将包含双引号的字符串添加到 sql 数据库?
Posted
技术标签:
【中文标题】如何将包含双引号的字符串添加到 sql 数据库?【英文标题】:How to add a string containg a double quote to a sql database? 【发布时间】: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 quotes, double quotes mess的可能重复 【参考方案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();
此代码段成功地将包含双引号的字符串添加到数据库中。
【讨论】:
以上是关于如何将包含双引号的字符串添加到 sql 数据库?的主要内容,如果未能解决你的问题,请参考以下文章