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
может не быть точным.