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); 
}

Любая помощь горячо приветствуется.


person Rpp    schedule 13.07.2017    source источник
comment
Если вы прочитаете его снова, сообщения об исключении будет достаточно Data truncated for column, что означает, что данные, которые вы вставляете, имеют большую длину, чем максимальная длина столбца.   -  person Abubakkar    schedule 13.07.2017
comment
Как я могу это исправить. Разве LONGBLOB не решает эту проблему?   -  person Rpp    schedule 13.07.2017
comment
Что такое столбец «AAL» здесь?   -  person Blasanka    schedule 13.07.2017
comment
это из stockList.get(0).getName()   -  person Rpp    schedule 13.07.2017
comment
Как определяется столбец в вашей таблице sql?   -  person Rabbit Guy    schedule 13.07.2017


Ответы (2)


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

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

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

person kaliatech    schedule 13.07.2017

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

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

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

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

person Emile Eichenberger    schedule 13.07.2017