Заявление. executeUpdate дает усеченную дату для столбца X в строке 1 ошибки
Я работаю над проектом Java, который пытается вставить данные в базу данных MySQL через tsv infile. При запуске этой программы выдает следующую ошибку:
Исключение в потоке "main" java.sql.SQLException: данные, усеченные для столбца "Службы" в строке 1 в com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946) в com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985) на com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631) на com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) на com.mysql.jdbc.Con (Connection.java:3277) в com.mysql.jdbc.Statement.executeUpdate(Statement.java:1402) в com.mysql.jdbc.Statement.executeUpdate(Statement.java:1317) в LogProcessing.LogReader.addDay(LogReader. Java:313) в LogProcessing.LogReader.updateTables(LogReader.java:177) в LogProcessing.LogReader.start(LogReader.java:59) в LogProcessing.LogReader.main(LogReader.java:45)
Код
s.executeUpdate(query);
где запрос
LOAD DATA INFILE 'C:/temp/BA5770/tmp/temp.dat'INTO TABLE thisweek FIELDS TERMINATED BY ' ';
Странно то, что когда я копирую этот запрос и напрямую вводю его в mysql, он принимается.
mysql> ЗАГРУЗИТЬ ДАННЫЙ ИНФИЛЬ 'C:/temp/BA5770/tmp/temp.dat'INTO TABLE thisweek ПОЛЯ, ПРЕКРАЩАЕМЫЕ' '; Запрос в порядке, затронуты 76932 строки, 65535 предупреждений (2,44 с). Записи: 76932 Удалено: 0 Пропущено: 0 Предупреждения: 76932
Стол выглядит так:
mysql> show columns from thisweek;
+------------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------------------+------+-----+---------+-------+
| functionID | smallint(5) unsigned | YES | MUL | NULL | |
| serverID | tinyint(3) unsigned | YES | | NULL | |
| date | date | YES | | NULL | |
| time | time | YES | | NULL | |
| calls | int(10) unsigned | YES | | NULL | |
| meanTime | float | YES | | NULL | |
| WSC | float | YES | | NULL | |
| THM_DB2 | float | YES | | NULL | |
| DEP | float | YES | | NULL | |
| Tandem | float | YES | | NULL | |
| LDAP | float | YES | | NULL | |
| PS | float | YES | | NULL | |
| IAV | float | YES | | NULL | |
| IMS | float | YES | | NULL | |
| Services | float | YES | | NULL | |
+------------+----------------------+------+-----+---------+-------+
15 rows in set (0.00 sec)
И входные данные выглядят так:
31 0 20111207 235900 19 0.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0
32 0 20111207 235900 405 60.94 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
33 0 20111207 235900 1 32.0 24.0 14.0 0.0 0.0 0.0 0.0 8.0 0.0 24.0
34 0 20111207 235900 3 39.0 36.0 21.0 6.0 0.0 0.0 0.0 8.0 0.0 32.0
35 0 20111207 235900 27 9.44 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0
1 ответ
Как вы можете сказать, что запрос принят на консоли MySQL?
Посмотрите на статус выполнения операторов:
Query OK, 76932 rows affected, 65535 warnings (2.44 sec)
Records: 76932 Deleted: 0 Skipped: 0 Warnings: 76932
За 76932
записи, предупреждения генерируются 76932
Это означает, что каждая запись имеет некоторую настраиваемую ошибку.
казнить show warnings
на консоли MySQL после load data ...
выполнение запроса и
возможно, вы увидите в основном ... data truncated ...
предупреждающие сообщения.
Работать с float
а также double
есть проблемы в MySQL.
Обходной путь должен:
- использование
decimal
или жеreal
типы данных болееfloat
а такжеdouble
, - используйте правильную плавающую точность в файлах данных. Но это утомительно для больших файлов данных.
Есть сообщения об ошибках и обходные пути на: