Mysql

mysqlimport 將 NULL 值意外導入為 int 0

  • March 24, 2020

我想了解如何使用mysqland創建一個像樣的備份文件mysqlimport。我知道我可以使用mysqldumpand mysql,但我正在學習使用組合:mysqland mysqlimport

我在 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 或使用某些字元將字元串括起來。

引用自:https://dba.stackexchange.com/questions/260809