Mysql в Java: усеченные данные для столбца "AAL" в строке 1 ошибка

Я пытаюсь вставить данные из ArrayLists в таблицу mysql в Java, однако продолжаю получать следующую ошибку: 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); 
}

Буду признателен за любую оказанную помощь.

2 ответа

Решение

Вы указали, что stockList.get(i).getPrice() является строкой, и вы помещаете кавычки вокруг значения во вставке. Таким образом, вы фактически пытаетесь вставить строковое значение в столбец DOUBLE. Обычно MySQL автоматически преобразует строки в double, однако я подозреваю, что по крайней мере некоторые из ваших значений getPrice() не являются действительными значениями типа double. Вы можете попробовать это вместо этого:

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

... но если некоторые цены не действительны, удваивается, это тоже не удастся.

Есть некоторые проблемы с вашей таблицей и дизайном запросов:

использование DATE, TIME, или же DATETIME типы для хранения даты и времени. LONGBLOB не предназначен для этого.

Усеченные данные - это фактически цена, которую вы пытаетесь вставить в DOUBLE колонка. Если getPrice() возвращает строку, вам нужно проверить разделители десятичных и thousant. MySQL использует. (точка) как десятичная дробь и (запятая) как разделитель thousant по умолчанию. И не используйте кавычки в вашем запросе.

При работе с ценами рассмотрите возможность использования DECIMAL как тип. FLOAT а также DOUBLE может не быть точным.

Другие вопросы по тегам