我正在尝试使用String
数据类型在MySQL数据库中存储包含HTML的Longtext
。但它总是说“你的SQL语法有错误”。我试图存储一个普通的String
,但它确实有效。
更新:
这是查询:
st.executeUpdate("insert into website(URL,phishing,source_code,active) values('" + URL + "','" + phishingState + "','" + sourceCode + "','" + webSiteState + "');");
我正在使用Java。
答案 0 :(得分:8)
SQL查询中的字符串通常由单引号括起来。 E.g。
INSERT INTO tbl (html) VALUES ('html');
但是如果HTML字符串本身也包含单引号,它将破坏SQL查询:
INSERT INTO tbl (html) VALUES ('<form onsubmit="validate('foo', 'bar')">');
您已经在语法高亮显示中看到它,SQL值在foo
之前结束,并且SQL解释器无法理解之后的内容。 SQL语法错误!
但这不是唯一的,它还为SQL injections(examples here)打开宽门。
在构建SQL查询期间,您确实需要清理SQL 。如何做到这取决于您用于执行SQL的编程语言。如果是例如PHP,则需要mysql_real_escape_string()
:
$sql = "INSERT INTO tbl (html) VALUES ('" . mysql_real_escape_string($html) . "')";
PHP中的替代方法是使用prepared statements,它将为您处理SQL转义。
如果您使用的是Java(JDBC),那么您需要PreparedStatement
:
String sql = "INSERT INTO tbl (html) VALUES (?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, html);
更新:事实证明您实际上在使用Java。您需要按如下方式更改代码:
String sql = "INSERT INTO website (URL, phishing, source_code, active) VALUES (?, ?, ?, ?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, URL);
preparedStatement.setString(2, phishingState);
preparedStatement.setString(3, sourceCode);
preparedStatement.setString(4, webSiteState);
preparedStatement.executeUpdate();
不要忘记正确处理JDBC资源。您可能会发现this article对于获取有关如何以正确方式执行基本JDBC内容的一些见解非常有用。希望这会有所帮助。
答案 1 :(得分:2)
尝试在要存储的字符串上使用mysql_real_escape_string
函数。这是最简单的方法。
答案 2 :(得分:1)
在将字符串插入数据库之前,您需要转义它。
答案 3 :(得分:1)
很难说没有看到查询。你可以发布吗?
我认为html字符串的某些部分需要转义,也许你错过了?