2012-06-26 42 views
1

我正在嘗試通過tsv infile將數據插入到mysql數據庫的java項目。當運行這個程序它給了我下面的錯誤:聲明。 executeUpdate在第1行給列X截斷日期錯誤

Exception in thread "main" java.sql.SQLException: Data truncated for column 'Services' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) at com.mysql.jdbc.Connection.execSQL(Connection.java:3277) at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1402) at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1317) at LogProcessing.LogReader.addDay(LogReader.java:313) at LogProcessing.LogReader.updateTables(LogReader.java:177) at LogProcessing.LogReader.start(LogReader.java:59) at 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> LOAD DATA INFILE 'C:/temp/BA5770/tmp/temp.dat'INTO TABLE thisweek FIELDS TERMINATED BY ' '; Query OK, 76932 rows affected, 65535 warnings (2.44 sec) Records: 76932 Deleted: 0 Skipped: 0 Warnings: 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,這意味着每個記錄有一定的調節誤差。
在mysql控制檯執行show warningsload data ...查詢執行和
也許你會看到主要是... data truncated ...警告消息。

使用floatdouble在MySQL中有問題。
一種解決方法是:

  1. 使用decimalreal數據類型在floatdouble
  2. 在數據文件中使用正確的浮動精度。但是這對於大數據文件來說是單調乏味的。

有報道錯誤和解決方法:

  1. In floating point have the same problem with FLOAT and DOUBLE. REAL and DECIMAL work fine.
  2. I don't know What happenig with Float and Double, but my shot is the ROUND made by Float... With DECIMAL will work fine.
  3. FLOAT and DOUBLE mess up with data probaly by they round procedures.
相關問題