首页 文章

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

提问于
浏览
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服务器版本对应的手册,以便在'00:00:00.0,128.40,128.50,127.30,128.20,1415200附近'使用正确的语法''在第1行

很高兴任何帮助:)

3 回答

  • 0

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

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

    参数化SQL的好处:

    • 预防SQL injection attacks

    • 避免容易出错的字符串转换(在本例中见证)

    • 代码和数据的分离,导致SQL更易于阅读

  • 6

    强烈建议:

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

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

    也:

    “准备”是你的朋友;)

    我想你可能已经在使用它了......但是你没有看到任何地方标记("?")

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

  • 1

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

相关问题