【问题标题】:dealing with numbers that contain comma in mysql处理mysql中包含逗号的数字
【发布时间】:2013-06-17 09:38:39
【问题描述】:

我正在制作一个程序,我将从 txt 文件中读取数据并将它们存储在 mysql 的表中。在我的程序中,我使用我想要的字段制作表格,然后使用“Load Data Infile”命令在表格中插入值。

我拥有的文件包含一列(命名为升)

带有浮点数的数据,例如

0,234

12,234

3,004 等

在我的程序开始时,当我创建表时,升字段被描述为 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;
    }

我该如何解决?有人可以帮我吗?我认为问题是逗号?我怎样才能让它识别它?

【问题讨论】:

  • “litres”列的 MySQL 数据类型是什么?
  • float 是数据类型

标签: java mysql


【解决方案1】:

解析十进制数字是特定于语言环境的。在将它提供给 MySQL 之前,您需要更改语句以将逗号字符 ',' 替换为点字符 '.'。一种方法是在您的 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, ',', '.')

您需要列出要导入的所有列。您“按原样”导入的列需要在没有“at”符号@ 的情况下列出;必须用点替换逗号的列需要用“at”符号@ 列出。对于每个浮点列,您需要在最后一行添加一个 replace 调用。

【讨论】:

  • 评论中提到的OP 它没有用逗号分隔数字。是浮点数。
  • @Karna 这正是该解决方案所期望的:字段由制表符分隔;逗号仍然是浮点数的一部分,使REPLACE 的调用能够成功。
【解决方案2】:

此异常意味着您插入到litres 列中的值大于该列可以容纳的值。查看您提到的值似乎您使用liters 作为varchar,检查您是否有大小限制。
更新您的表格以允许所需的值。

【讨论】:

  • 我也在升字段中添加了 double,但我得到了完全相同的例外。
  • @dedmar:可以添加litrescolumn 定义吗?
  • 不,我在上面显示的代码中使用升作为浮点数。
  • 字段:升 类型:浮点数 NULL:YES DEFAULT:Null
  • @dedmar: 不确定浮点数是否允许, 分隔数字,你应该改用varchar
【解决方案3】:

可能是你的文件有空记录,就是报错了。

在此处查看类似问题:Getting a mysql Error Code: 1265. Data truncated for column when doing a LOAD DATA LOCAL INFILE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 2011-11-22
    • 2013-08-09
    • 2023-04-03
    • 1970-01-01
    • 2011-03-09
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多