問題描述
在使用mysql導(dǎo)入數(shù)據(jù)的過程中,存在一個讓人棘手的問題:null值在導(dǎo)入后都變成了0值。雖然在許多情況下,這種處理方式并不會帶來大的影響,但是對于一些對數(shù)據(jù)精細(xì)度有要求的應(yīng)用場景,這個問題可不是那么容易被忽視的。
問題原因
導(dǎo)致這個問題的原因是,mysql在導(dǎo)入數(shù)據(jù)時,如果數(shù)據(jù)列中存在null值,那么mysql就會默認(rèn)將它們賦值為0,這樣處理可以避免在數(shù)據(jù)表中出現(xiàn)未定義的數(shù)據(jù)。而用戶如果想要將null值原封不動地導(dǎo)入到數(shù)據(jù)表中,則需要在導(dǎo)入的時候明確告訴mysql,null的值應(yīng)該如何處理。
解決方法
要想將null值正確導(dǎo)入數(shù)據(jù)表中,需要在導(dǎo)入時加入?yún)?shù)“--fields-enclosed-by=”和“--fields-optionally-enclosed-by=”,具體命令如下:
mysql -uroot -p --fields-enclosed-by=\" --fields-optionally-enclosed-by=\" -e "LOAD DATA LOCAL INFILE 'data.csv' INTO TABLE `my_table` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' ";
這樣就可以保證在數(shù)據(jù)導(dǎo)入的過程中,null值可以被正確地保留,而不被轉(zhuǎn)化為0。需要注意的是,這個方法只適用于導(dǎo)入數(shù)據(jù)的方式,如果需要在數(shù)據(jù)表中對null值進(jìn)行處理,則需要使用ifnull或者case等函數(shù)。
小結(jié)
mysql導(dǎo)入數(shù)據(jù)null變?yōu)?的問題雖然在許多場景下并不會產(chǎn)生大的影響,但在一些需要數(shù)據(jù)精細(xì)度的場景下,它的影響是不可忽視的。通過使用"--fields-enclosed-by=”和“--fields-optionally-enclosed-by=”這兩個參數(shù),我們可以完美地解決這個問題。在此基礎(chǔ)上,如果我們需要對數(shù)據(jù)表中的null值進(jìn)行更加細(xì)致的處理,則可以使用ifnull或者case等函數(shù)來實現(xiàn)。