1

txt ファイルからデータを読み取り、それらを mysql のテーブルに格納するプログラムを作成しています。私のプログラムでは、必要なフィールドを含むテーブルを作成してから、「Load Data Infile」コマンドを使用してテーブルに値を挿入しています。


ここに画像の説明を入力
私が持っているファイルには、次のような浮動小数点数であるデータを含む列 (litres という名前) が含まれています。

0,234

12,234

3,004 等

テーブルを作成するときのプログラムの最初で、liters フィールドは FLOAT として記述されます。しかし、プログラムを実行すると、SQLException : Data truncated for column 'litres' at row 1.

テーブルを作成して値を挿入するコードは次のとおりです。

private static String getCreateTable1(Connection con, String tablename) {

        try {
            Class.forName("com.mysql.jdbc.Driver");
            Statement stmt = con.createStatement();
            String createtable = "CREATE TABLE " + tablename
                    + " ( text VARCHAR(255), price INT , day VARCHAR(255), litres FLOAT )";
            System.out.println("Create a new table in the database");
            stmt.executeUpdate(createtable);
        } catch (Exception e) {
            System.out.println(((SQLException) e).getSQLState());
            System.out.println(e.getMessage());
            e.printStackTrace();
        }

        return null;
    }

    private static String importData(Connection con, File txtFile,
            String tablename) {

        try {
            Statement stmt;

            stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_UPDATABLE);
            String path = txtFile.getAbsolutePath();
            String importingdata = "LOAD DATA INFILE '"
                    + path.replace('\\', '/')
                    + "' INTO TABLE " + tablename
                    + " FIELDS TERMINATED BY '\t'";
            System.out.println("fill the table");
            stmt.executeUpdate(importingdata);

        } catch (Exception e) {
            System.out.println(((SQLException) e).getSQLState());
            System.out.println(e.getMessage());
            e.printStackTrace();

        }
        return null;
    }

どうすれば修正できますか?誰でも私を助けることができますか?問題はコンマだと思いますか?どうすれば認識させることができますか?

4

3 に答える 3

1

10 進数の解析はロケール固有です。MySQL に渡す前に、カンマ文字','をドット文字に置き換えるようにステートメントを変更する必要があります。これを行う 1 つの方法は、ステートメント'.'にキャストを追加することです。LOAD DATA INFILE

LOAD DATA INFILE 'myfile.txt'
INTO TABLE tablename
FIELDS TERMINATED BY '\t'
(COL1, @litres, COL3, ...) -- Note the @ in front of the float column
SET litres = REPLACE(@litres, ',', '.')

インポートするすべての列をリストする必要があります。「そのまま」インポートする列は、「アット」記号なしでリストする必要があります@。コンマをドットに置き換える必要がある列には、「アット」記号を付けてリストする必要があります@replacefloat 列ごとに、最後の行に呼び出しを追加する必要があります。

于 2013-06-17T10:04:36.133 に答える
0

この例外は、列に挿入しようとしている値がlitres、列が収容できるよりも大きいことを意味します。あなたが言及した値を見ると、 として使用 litersしているように見えますvarchar。サイズ制限があるかどうかを確認してください。
必要な値を許可するようにテーブルを更新します。

于 2013-06-17T09:42:36.280 に答える