1

尝试从 Java 向 Mysql 插入一些值时出现语法错误。

我的代码如下所示:

date = new SimpleDateFormat("yyyy-MM-dd").parse(nextLine[0]);
        java.sql.Timestamp sqlDate = new java.sql.Timestamp(date.getTime());
        st.executeUpdate("INSERT INTO " + tick + "(day, open, high, low, close, volume) VALUES (" + sqlDate + ", " + nextLine[1] + ", " + nextLine[2] + ", " + nextLine[3] + ", " + nextLine[4] + ", " + nextLine[5] + ")"); 

我的例外:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '00:00:00.0, 128.40, 128.50, 127.30, 128.20, 1415200)' 附近使用正确的语法

很高兴有任何帮助:)

4

3 回答 3

6

虽然可以修复直接的语法错误,但我强烈建议不要这样做。您根本不应该将值直接包含在 SQL 中。

相反,通过 使用参数化查询PreparedStatement,并将您的值设置为参数。在这种情况下,您将使用PreparedStatement.setTimestamp设置值 - 当然,在首先更改要参数化的查询之后。

参数化 SQL 的好处:

  • SQL注入攻击的预防
  • 避免容易出错的字符串转换(如本例所示)
  • 代码和数据分离,SQL更易读
于 2012-10-05T20:19:06.940 回答
1

强烈建议:

1) 在调用 executeUpdate() 之前创建一个 Java 字符串变量

2) 确保您的字符串在语法上是正确的(引用的日期、值之间的逗号等)

还:

“准备”是你的朋友;)

你可能已经在使用它们了......但你没有显示那部分代码......我当然没有看到任何地标(“?”)

但我认为1)首先制作字符串,2)在你的JDBC调用之前检查字符串(例如在你的调试器中)将是一个巨大的帮助......恕我直言......

于 2012-10-05T20:18:58.483 回答
0

日期需要在 MySQL 中引用,因此您需要sqlDate用单引号括起来:

st.executeUpdate("INSERT INTO " + tick + "(day, open, high, low, close, volume) VALUES ('" + sqlDate + "', " + nextLine[1] + ", " + nextLine[2] + ", " + nextLine[3] + ", " + nextLine[4] + ", " + nextLine[5] + ")");

我假设其他值是数字,因此没有引号是安全的。

这种方法的最大问题是您容易受到SQL 注入攻击。您应该改用准备好的语句:

PreparedStatement ps = conn.prepareStatement("INSERT INTO my_table(day, open, high, low, close, volume) VALUES (?,?,?,?,?,?)");
ps.setTimestamp(1, sqlDate);
ps.setBigDecimal(2, nextLine[1]);
...
于 2012-10-05T20:22:01.530 回答