加载数据Infile - 负十进制截断(到正数)

时间:2011-02-09 18:25:10

标签: sql mysql decimal

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

以下是我的查询:

> 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'列。”当我查看数据时,它存储为正数。任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

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

在您的情况下,您可以将字符串加载到局部变量中,然后将其单独使用或乘以负数,具体取决于它是否以减号结尾。

这样的事情对你有用:

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

答案 1 :(得分:0)

我不确定你为什么要在数字之后而不是之前加上减号。当你在行的开头放置“ - ”符号时,它是否有效?

答案 2 :(得分:0)

你可以考虑这个

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;
相关问题