2011-02-09 37 views
0

我無法將十進制數據加載到數據庫 - 特別是,我的負數被截斷,我無法弄清楚。加載數據Infile - 負數十進制截斷(到正數)

這裏是我的查詢看起來是這樣的:

> 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'。「當我查看數據時,它將存儲爲正數。任何想法如何解決這一問題?

回答

2

處理數據異常這樣在輸入文件的最好方法是將其加載到一個局部變量,然後基於局部的改造實際列值變量。

在你的情況下,你可以將字符串加載到局部變量中,然後根據它是否以一個減號結束,讓它保持獨立或乘以負值。

像這樣的東西應該爲你工作:

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

謝謝 - 這工作完美,並在我的1GB測試文件花了33秒。 – 2011-02-10 00:09:00

0

我不知道爲什麼你要在數字之後加上減號而不是之前。當您將' - '標誌放在行首時它是否工作?

+0

我試過了,但它仍然沒有奏效。希望我能奇蹟般地改變' - '符號的位置。我可以使用sed去除' - ',並將它放在另一列中,但似乎有點倒退。 – 2011-02-09 18:41:17

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; 
+0

謝謝 - 這工作得很好。我也不知道劇組或子串是什麼!作爲一個基準,Ike的方法在1GB數據集上以33.1秒的速度運行得更快......然而這需要27.33 + 32.77 + 23.15 = 83.25秒。 – 2011-02-10 00:11:14