MySQL從CSV數據加載NULL值我有一個文件,可以包含3到4列數字,用逗號分隔。當空字段位于行的末尾時,將定義空字段:1,2,3,4,51,2,3,,51,2,3下表是在MySQL中創建的:+ ------- + -------- + ------ + ------ + --------- + ------- +| 領域| 輸入| 空| 鑰匙| 默認| 額外的|+ ------- + -------- + ------ + ------ + --------- + ------- +| 一個| int(1)| 是的| | NULL | || 兩個| int(1)| 是的| | NULL | || 三個| int(1)| 是的| | NULL | || 四個| int(1)| 是的| | NULL | || 五| int(1)| 是的| | NULL | |+ ------- + -------- + ------ + ------ + --------- + ------- +我正在嘗試使用MySQL LOAD命令加載數據:LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS TERMINATED BY "," LINES TERMINATED BY "\n";結果表:+ ------ + ------ + ------- + ------ + ------ +| 一個| 兩個| 三個| 四個| 五|+ ------ + ------ + ------- + ------ + ------ +| 1 | 2 | 3 | 4 | 5 || 1 | 2 | 3 | 0 | 5 || 1 | 2 | 3 | NULL | NULL |+ ------ + ------ + ------- + ------ + ------ +問題在于,當原始數據中的字段為空且未定義時,MySQL由于某種原因不使用列默認值(即NULL)并使用零。當字段完全丟失時,正確使用NULL。不幸的是,我必須能夠在這個階段區分NULL和0,所以任何幫助將不勝感激。謝謝S.編輯SHOW WARNINGS的輸出:+ --------- + ------ + -------------------------------- ------------------------ +| 等級| 代碼| 消息|+ --------- + ------ + -------------------------------- ------------------------ +| 警告| 1366 | 不正確的整數值:''對于第2行的第4列'| 警告| 1261 | 第3行不包含所有列的數據| 警告| 1261 | 第3行不包含所有列的數據+ --------- + ------ + -------------------------------- ------------------------ +
3 回答

largeQ
TA貢獻2039條經驗 獲得超8個贊
這將做你想要的。它將第四個字段讀入局部變量,然后將實際字段值設置為NULL,如果局部變量最終包含空字符串:
LOAD DATA infile '/tmp/testdata.txt'
INTO TABLE moo
fields terminated BY ","
lines terminated BY "\n"
(one, two, three, @vfour, five)
SET four = nullif(@vfour,'')
;
如果它們都可能是空的,那么你將它們全部讀入變量并有多個SET語句,如下所示:
LOAD DATA infile '/tmp/testdata.txt'
INTO TABLE moo
fields terminated BY ","
lines terminated BY "\n"
(@vone, @vtwo, @vthree, @vfour, @vfive)
SET
one = nullif(@vone,''),
two = nullif(@vtwo,''),
three = nullif(@vthree,''),
four = nullif(@vfour,'')
;

達令說
TA貢獻1821條經驗 獲得超6個贊
根據數據庫配置,行為會有所不同。在嚴格模式下,這會拋出錯誤,否則會發出警告。以下查詢可用于標識數據庫配置。
mysql> show variables like 'sql_mode';
添加回答
舉報
0/150
提交
取消