来自Java的INSERT MySql时出现语法错误

时间:2012-10-05 20:14:20

标签: java mysql syntax insert timestamp

尝试从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服务器版本,在'00:00:00.0附近使用正确的语法,   128.40,128.50,127.30,128.20,1415200)'第1行

很高兴得到任何帮助:)

3 个答案:

答案 0 :(得分:6)

虽然可以修复即时语法错误,但我会强烈推荐它。您根本不应该直接在SQL中包含这些值。

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

参数化SQL的好处:

  • 预防SQL injection attacks
  • 避免容易出错的字符串转换(在本例中见证)
  • 分离代码和数据,导致SQL更易于阅读

答案 1 :(得分:1)

强烈建议:

1)在调用executeUpdate()

之前创建一个Java字符串变量

2)确保你的字符串语法正确(引用日期,值之间用逗号等)

ALSO:

“准备”是你的朋友;)

认为你可能已经在使用它们......但是你没有显示那部分代码......我当然没有看到任何地方标记(“?”)< / p>

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

答案 2 :(得分: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 injection attacks的影响。您应该切换到使用预准备语句:

PreparedStatement ps = conn.prepareStatement("INSERT INTO my_table(day, open, high, low, close, volume) VALUES (?,?,?,?,?,?)");
ps.setTimestamp(1, sqlDate);
ps.setBigDecimal(2, nextLine[1]);
...