【问题标题】:Syntax error while INSERT MySql from Java从 Java 插入 MySql 时出现语法错误
【发布时间】:2012-10-05 20:14:20
【问题描述】:

尝试从 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 行

很高兴得到任何帮助:)

【问题讨论】:

  • 请显示您发送到数据库的查询

标签: java mysql syntax insert timestamp


【解决方案1】:

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

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

参数化 SQL 的好处:

  • 防止SQL injection attacks
  • 避免容易出错的字符串转换(如本例所示)
  • 代码与数据分离,SQL更易读

【讨论】:

  • 谢谢。我会看看 PreparedStatemet 看看我是否明白了!我对 MySql 完全陌生,所以..:P
  • @ZedIsDead:每当您使用 any 编程语言中的 any 数据库时,您都应该这样做。如果某些数据库/语言对不支持它,迫使您直接构建 SQL,那应该是一个警告信号...
  • PS:“ZedIsDead”是指昆汀·塔伦蒂诺的电影,还是昆汀·塔伦蒂诺致敬的约翰·布尔曼电影“Zardoz”?还是完全不同的东西?
【解决方案2】:

强烈建议:

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

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

还有:

“准备”是你的朋友;)

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

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

【讨论】:

    【解决方案3】:

    日期需要在 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]);
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 2018-09-04
      • 2014-04-29
      • 2015-10-09
      • 2020-10-10
      相关资源
      最近更新 更多