1

私は、tsv infile を介して mysql データベースにデータを挿入しようとする Java プロジェクトに取り組んでいます。このプログラムを実行すると、次のエラーが表示されます。

スレッド「メイン」の例外 java.sql.SQLException: 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.Connection.execSQL (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> LOAD DATA INFILE 'C:/temp/BA5770/tmp/temp.dat'INTO TABLE thisweek フィールドは ' ' で終了します。クエリ OK、影響を受ける 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
4

1 に答える 1

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 ...

MySQLを使用floatして問題を抱えている。 回避策は次のとおりです。 double

  1. decimalまたはrealデータ型をfloatおよび で使用しdoubleます。
  2. データ ファイルで正しい浮動小数点精度を使用します。しかし、これは大きなデータ ファイルでは面倒です。

報告されたバグと回避策は次の場所にあります。

  1. 浮動小数点では、FLOAT と DOUBLE で同じ問題があります。REAL と DECIMAL は問題なく動作します。
  2. Float と Double で何が起こっているのかわかりませんが、私のショットは Float で作成された ROUND です... DECIMAL では問題なく動作します。
  3. FLOAT と DOUBLE は、プロシージャを丸めることによって、おそらくデータを台無しにします。
于 2012-06-26T16:32:19.220 に答える