mysqlimport 將 NULL 值意外導入為 int 0
我想了解如何使用
mysql
and創建一個像樣的備份文件mysqlimport
。我知道我可以使用mysqldump
andmysql
,但我正在學習使用組合:mysql
andmysqlimport
。我在 Windows 10 中使用 mysql5.7.21。我有測試表:飛機,看起來像這樣:
我想通過
mysql
客戶端工具將此表導出到文本文件。所以我這樣做:mysql -h localhost -u root -D julian -p -e "SELECT * FROM `aircrafts` " > aircrafts.txt
這將創建備份文件,其內容為:
id countryFactoryID name type price 1 1 Cessna 172 Skyhawk GA 60000 2 43 Diamond DA40 GA NULL 3 1 Cirrus SR20 GA NULL 4 1 Piper PA-28 Cherokee GA NULL 5 1 Beechcraft A23 Musketeer GA NULL 6 1 Grumman American AA-5 Traveller GA NULL
我注意到備份文件是它使用
NULL
而不是\N
.但我猜沒關係。
接下來,我像這樣導入備份文件:
mysqlimport --local -l -v --ignore-lines=1 -p -u root myDB aircrafts.txt
CLI 中的輸出為:
Connecting to localhost Selecting database myDB Locking tables for write Loading data from LOCAL file: aircrafts.txt into aircrafts myDB.aircrafts: Records: 6 Deleted: 0 Skipped: 0 Warnings: 6 Disconnecting from localhost
好的,到目前為止一切順利。
當我查看 phpmyadmin 時,我看到了這個:
如您所見,價格是
0
,但我想要一個 NULL 值,就像第一張圖片中一樣。這很奇怪,因為我列價格的預設值為 NULL。我究竟做錯了什麼?
我試過尼基塔的回答。所以我使用了這樣的mysql命令:
mysql -h localhost -u root -D julian -p -e "SELECT id, countryFactoryID, name, type, IFNULL(price, '\\N') AS price FROM `aircrafts` " > aircrafts.txt
結果是:
id countryFactoryID name type price 1 1 Cessna 172 Skyhawk GA 60000 2 43 Diamond DA40 GA \\N 3 1 Cirrus SR20 GA \\N 4 1 Piper PA-28 Cherokee GA \\N 5 1 Beechcraft A23 Musketeer GA \\N 6 1 Grumman American AA-5 Traveller GA \\N
好吧……這不是我想要的;轉義是錯誤的。
所以我不得不使用
SELECT ... INTO OUTFILE
.mysql -h localhost -u root -p -D julian -e "SELECT * INTO OUTFILE 'aircrafts.txt' FROM aircrafts;"
aircrafts.txt的內容:
1 1 Cessna 172 Skyhawk GA 60000 2 43 Diamond DA40 GA \N 3 1 Cirrus SR20 GA \N 4 1 Piper PA-28 Cherokee GA \N 5 1 Beechcraft A23 Musketeer GA \N 6 1 Grumman American AA-5 Traveller GA \N
萬歲,它有效!
在此處閱讀有關它的更多資訊:
https://medium.com/@julek23/how-to-create-an-database-export-with-select-into-outfile-f10983a22db1
這個問題是由 MySQL LOAD DATA 處理 NULL 的方式引起的:
NULL 值的處理因使用的 FIELDS 和 LINES 選項而異:
對於預設的 FIELDS 和 LINES 值,NULL 被寫入為 \N 的欄位值用於輸出,而 \N 的欄位值被讀取為 NULL 用於輸入(假設 ESCAPED BY 字元為 )。
如果 FIELDS ENCLOSED BY 不為空,則將包含文字 NULL 作為其值的欄位讀取為 NULL 值。這與包含在 FIELDS ENCLOSED BY 字元中的單詞 NULL 不同,後者被讀取為字元串“NULL”。
如果 FIELDS ESCAPED BY 為空,則將 NULL 寫入單詞 NULL。
對於固定行格式(當 FIELDS TERMINATED BY 和 FIELDS ENCLOSED BY 都為空時使用),NULL 被寫為空字元串。這會導致表中的 NULL 值和空字元串在寫入文件時無法區分,因為兩者都是作為空字元串寫入的。如果在讀回文件時需要能夠區分兩者,則不應使用固定行格式。
在您的情況下,NULL 被視為單詞“NULL”,如果您嘗試將“NULL”轉換為數字,它將返回 0。您需要將 NULL 更改為 \N 或使用某些字元將字元串括起來。