Java 中的 Mysql:第 1 行错误的第 'AAL' 列数据被截断

Mysql in Java: Data truncated for column 'AAL' at row 1 error

我正在尝试将 ArrayLists 中的数据插入 Java 中的 mysql table,但是我不断收到以下错误:java.sql.SQLException:数据被截断列'AAL' 在第 1 行。

下面是一些代码:

stmt = conn.createStatement();

sql = "CREATE TABLE IF NOT EXISTS stocks "
             + "(id INTEGER not NULL AUTO_INCREMENT, date LONGBLOB , " + "time LONGBLOB, "
             + " PRIMARY KEY ( id ))";

stmt.executeUpdate(sql);
System.out.println("Created table in given database...");

for (int i = 0; i < stockList.size(); i++) {
   System.out.println(stockList.get(i).getName() + i);

   sql = "ALTER TABLE stocks ADD " + stockList.get(i).getName() + " DOUBLE";
stmt.executeUpdate(sql);
    }

for (int i = 0; i < stockList.size(); i++) {
    System.out.println(i);

    sql = "INSERT INTO stocks (id, date, time, " + stockList.get(i).getName() + ") VALUES (NULL, '" + stockList.get(i).getDate() +
             "', '" + stockList.get(i).getTime() + "', '" + stockList.get(i).getPrice() + "')";
        stmt.executeUpdate(sql); 
}

非常感谢任何帮助。

您指出 stockList.get(i).getPrice() 是一个字符串,并且您在插入的值两边加上了引号。因此,您实际上是在尝试将字符串值插入到 DOUBLE 列中。通常 MySQL 会自动将字符串转换为双精度数,但是,我怀疑至少您的一些 getPrice() 值不是有效的双精度数。您可以试试这个:

... "', " + Double.parseDouble(stockList.get(i).getPrice()) + ")";

..但如果某些价格不是有效的双倍价格,这也会失败。

您的 table 和查询设计存在一些问题:

使用 DATETIMEDATETIME 类型来存储日期和时间。 LONGBLOB 不适用于此。

被截断的数据实际上是您要插入 DOUBLE 列的价格。如果 getPrice() 返回字符串,则需要检查小数点和千位分隔符。 MySQL 使用 .默认情况下,(点)作为十进制和,(逗号)作为千位分隔符。并且不要在查询中使用引号。

处理价格时,请考虑使用 DECIMAL 作为类型。 FLOATDOUBLE 可能不准确。