如果我嘗試按不同的順序加載相同的兩行數據,我會得到一個錯誤,一個嘗試,另一個成功。MySQL LOAD DATA INFILE錯誤通過數據行的順序觸發
CREATE TABLE `test` (
`date` varchar(20) NOT NULL DEFAULT '',
`val1` float DEFAULT NULL,
`val2` smallint(6) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
fail.txt
Date,Val1,Val2
3/30/2004,,17
4/4/2004,91.4210526315789,20
pass.txt
Date,Val1,Val2
4/4/2004,91.4210526315789,20
3/30/2004,,17
相同的命令不同的結果
-> LOAD DATA INFILE '/tmp/fail.txt' REPLACE INTO TABLE `test` FIELDS TERMINATED BY ',' IGNORE 1 LINES;
<- ERROR 1265 (01000) at line 1: Data truncated for column 'val1' at row 1
-> SELECT * FROM test;
<- Empty set (0.00 sec)
-> LOAD DATA INFILE '/tmp/pass.txt' REPLACE INTO TABLE `test` FIELDS TERMINATED BY ',' IGNORE 1 LINES;
-> SELECT * FROM test;
<- +-----------+---------+------+
<- | date | val1 | val2 |
<- +-----------+---------+------+
<- | 4/4/2004 | 91.4211 | 20 |
<- | 3/30/2004 | 0 | 17 |
<- +-----------+---------+------+
<- 2 rows in set (0.00 sec)
予刪除該表和嘗試之間重新創建。
這是使用:mysqld的版本5.6.15的osx10.7在x86_64(MySQL社區服務器(GPL))
有什麼我可以做,使fail.txt將加載而不編輯數據?
編輯:
對於它的價值,我現在相信這個問題是關係到MySQL服務器版本和/或配置我跑。針對另一個mysqld(Ubuntu上的5.5.32),fail.txt加載沒有錯誤。
編輯2:
好像我應該能像下面這樣,但我不知道的第二個參數REPLACE
應該是什麼。
LOAD DATA INFILE '/tmp/fail.txt' REPLACE INTO TABLE `test`
FIELDS TERMINATED BY ',' IGNORE 1 LINES
(date, @val1, val2)
SET val1 = REPLACE(@val1, '', '\N');
編輯3:
想通了這一點:
LOAD DATA INFILE '/tmp/fail.txt' REPLACE INTO TABLE `test`
FIELDS TERMINATED BY ',' IGNORE 1 LINES
(date, @val1, val2)
SET val1 = IF(LENGTH(@val1) = 0, NULL, @val);
對不起,但這仍然不能解釋的事情。相同的空字段(',,')可以作爲pass.txt中第二行的一部分。 – Jobu
@jobu如果你在第一個文件中改變它,你會得到錯誤信息?你可以添加桌子的ddl嗎? – Jens
DDL包含在問題中。請參閱CREATE TABLE語句。 – Jobu