【问题标题】:Load Data Infile - negative decimal truncated (to positive number)加载数据文件 - 负十进制截断(正数)
【发布时间】:2011-06-24 08:21:46
【问题描述】:

我无法将十进制数据加载到数据库中 - 具体来说,我的负数被截断了,我无法弄清楚。

这是我的查询的样子:

> CREATE TABLE IF NOT EXISTS mytable (id INT(12) NOT NULL AUTO_INCREMENT,
                                    mydecimal DECIMAL(13,2),PRIMARY KEY(id));
> LOAD DATA INFILE 'data.dat' INTO TABLE mytable FIELDS TERMINATED BY ';';

还有我正在加载的 data.dat:

;000000019.50 ;
;000000029.50-;
;000000049.50 ;

当它完成时,给我一个警告“第 2 行的 'mydecimal' 列的数据被截断。”当我查看数据时,它存储为正数。任何想法如何解决这个问题?

【问题讨论】:

    标签: sql mysql decimal


    【解决方案1】:

    在输入文件中处理此类数据异常的最佳方法是将它们加载到局部变量中,然后根据局部变量的转换设置实际列值。

    在您的情况下,您可以将字符串加载到局部变量中,然后根据它是否以减号结尾,要么不理会它,要么乘以负数。

    这样的东西应该适合你:

    LOAD DATA INFILE 'data.dat' 
    INTO TABLE mytable FIELDS TERMINATED BY ';' 
    (id,@mydecimal)
    set mydecimal = IF(@mydecimal like '%-',@mydecimal * -1,@mydecimal);
    

    【讨论】:

    • 谢谢 - 这很完美,在我的 1GB 测试文件上花了 33 秒。
    【解决方案2】:

    我不确定您为什么将减号放在数字之后而不是之前。将“-”号放在行首是否有效?

    【讨论】:

    • 我试过了,但还是不行。希望我能神奇地改变“-”标志的位置。我可以使用 sed 去除“-”并将其放在另一列中,但这似乎有点倒退。
    【解决方案3】:

    你可以考虑一下

    CREATE TABLE IF NOT EXISTS mytable (id INT(12) NOT NULL AUTO_INCREMENT,
    mydecimal varchar(255),PRIMARY KEY(id));
    
    LOAD DATA INFILE 'data.dat' INTO TABLE mytable FIELDS TERMINATED BY ';';
    
    update mytable set mydecimal = 
    cast(mydecimal as decimal(13,2))*if (substring(mydecimal, -1)='-', -1, 1);
    
    alter table mytable modify column mydecimal decimal(13,2) signed;
    

    【讨论】:

    • 谢谢 - 这很好用。我也不知道演员表或子字符串!作为基准,Ike 的方法在 33.1 秒的 1GB 数据集上运行得更快……而这需要 27.33+32.77+23.15 = 83.25 秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2019-01-27
    • 2013-10-20
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多