LOAD DATA
[LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var
[, col_name_or_user_var] ...)]
[SET col_name={expr | DEFAULT}
[, col_name={expr | DEFAULT}] ...]
LOAD DATA
語法會以非常高的速度從文字檔案讀取資料列到資料表中。檔案可以從伺服器主機或用戶端主機讀取,取決於是否給定 LOCAL
修飾符。LOCAL
也會影響資料解譯和錯誤處理。
LOAD DATA
是 SELECT ... INTO OUTFILE
的互補語法。(請參閱 章節 15.2.13.1,「SELECT ... INTO 語法」。) 若要將資料從資料表寫入檔案,請使用 SELECT ... INTO OUTFILE
。若要將檔案讀回資料表中,請使用 LOAD DATA
。FIELDS
和 LINES
子句的語法對於這兩種語法是相同的。
mysqlimport 工具提供另一種載入資料檔案的方式;它的運作方式是將 LOAD DATA
語法傳送到伺服器。請參閱 章節 6.5.5,「mysqlimport — 資料匯入程式」。
有關 INSERT
與 LOAD DATA
的效率以及加快 LOAD DATA
速度的相關資訊,請參閱 章節 10.2.5.1,「最佳化 INSERT 語法」。
與非 LOCAL
操作相比,LOCAL
修飾符會影響 LOAD DATA
的這些方面
只有在伺服器和您的用戶端都已設定為允許 LOCAL
時,LOCAL
才會運作。例如,如果 mysqld 在啟動時停用了 local_infile
系統變數,LOCAL
會產生錯誤。請參閱 章節 8.1.6,「LOAD DATA LOCAL 的安全性考量」。
檔案名稱必須以字串常值的形式給定。在 Windows 上,請以正斜線或雙反斜線指定路徑名稱。伺服器會使用 character_set_filesystem
系統變數指示的字元集解譯檔案名稱。
根據預設,伺服器會使用 character_set_database
系統變數指示的字元集解譯檔案內容。如果檔案內容使用的字元集與此預設值不同,最好使用 CHARACTER SET
子句指定該字元集。binary
的字元集指定為「不轉換。」
SET NAMES
和 character_set_client
的設定不會影響檔案內容的解譯。
LOAD DATA
會將檔案中的所有欄位解譯為具有相同的字元集,無論載入欄位值的欄位之資料類型為何。為了正確解譯檔案,您必須確保檔案是以正確的字元集寫入的。例如,如果您使用 mysqldump -T 或在 mysql 中發出 SELECT ... INTO OUTFILE
語法來寫入資料檔案,請務必使用 --default-character-set
選項,以在使用 LOAD DATA
載入檔案時要使用的字元集寫入輸出。
無法載入使用 ucs2
、utf16
、utf16le
或 utf32
字元集的資料檔案。
這些規則會決定 LOAD DATA
輸入檔案的位置
如果未指定
LOCAL
,則檔案必須位於伺服器主機上。伺服器會直接讀取檔案,並依下列方式尋找檔案如果檔案名稱是絕對路徑名稱,伺服器會按原樣使用它。
如果檔案名稱是帶有前導元件的相對路徑名稱,伺服器會相對於其資料目錄尋找檔案。
如果檔案名稱沒有前導元件,伺服器會在預設資料庫的資料庫目錄中尋找檔案。
如果指定了
LOCAL
,則檔案必須位於用戶端主機上。用戶端程式會讀取檔案,並依下列方式尋找檔案如果檔案名稱是絕對路徑名稱,用戶端程式會按原樣使用它。
如果檔案名稱是相對路徑名稱,用戶端程式會相對於其調用目錄尋找檔案。
使用
LOCAL
時,用戶端程式會讀取檔案並將其內容傳送到伺服器。伺服器會在它儲存暫存檔案的目錄中建立檔案的副本。請參閱 章節 B.3.3.5,「MySQL 儲存暫存檔案的位置」。如果此目錄中沒有足夠的空間來儲存副本,可能會導致LOAD DATA LOCAL
語法失敗。
非 LOCAL
規則表示伺服器會相對於其資料目錄讀取名為 ./myfile.txt
的檔案,而它會從預設資料庫的資料庫目錄讀取名為 myfile.txt
的檔案。例如,如果在 db1
是預設資料庫時執行下列 LOAD DATA
語法,伺服器會從 db1
的資料庫目錄讀取檔案 data.txt
,即使該語法明確地將檔案載入到 db2
資料庫的資料表中
LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
伺服器也會使用非 LOCAL
規則來尋找 IMPORT TABLE
語法的 .sdi
檔案。
對於非 LOCAL
載入操作,伺服器會讀取位於伺服器主機上的文字檔案,因此必須滿足這些安全性需求
您必須具有
FILE
權限。請參閱 章節 8.2.2,「MySQL 提供的權限」。此操作會受到
secure_file_priv
系統變數設定的約束如果變數值為非空白目錄名稱,則檔案必須位於該目錄中。
如果變數值為空白 (這是不安全的),則檔案只需要可供伺服器讀取即可。
對於 LOCAL
載入操作,用戶端程式會讀取位於用戶端主機上的文字檔案。由於檔案內容是由用戶端透過連線傳送到伺服器,因此使用 LOCAL
比伺服器直接存取檔案的速度稍慢。另一方面,您不需要 FILE
權限,而且檔案可以位於用戶端程式可以存取的任何目錄中。
REPLACE
和 IGNORE
修飾符控制如何處理重複現有資料表資料列的唯一鍵值 (PRIMARY KEY
或 UNIQUE
索引值) 的新 (輸入) 資料列
使用
REPLACE
時,與現有資料列中的唯一鍵值具有相同值的新資料列會取代現有資料列。請參閱 章節 15.2.12,「REPLACE 語法」。使用
IGNORE
時,在唯一鍵值上重複現有資料列的新資料列會被捨棄。如需詳細資訊,請參閱 IGNORE 對語法執行的影響。
LOCAL
修飾符的效果與 IGNORE
相同。發生這種情況是因為伺服器無法在操作過程中停止傳輸檔案。
如果未指定 REPLACE
、IGNORE
或 LOCAL
,則在找到重複鍵值時會發生錯誤,並忽略其餘的文字檔案。
除了影響如上所述的重複鍵處理之外,IGNORE
和 LOCAL
也會影響錯誤處理
如果沒有
IGNORE
和LOCAL
,資料解譯錯誤會終止操作。使用
IGNORE
或LOCAL
時,資料解析錯誤會變成警告,即使 SQL 模式是嚴格的,載入操作仍會繼續。例如,請參閱 欄位值指派。
若要在載入操作期間忽略外鍵約束,請在執行 LOAD DATA
前,先執行 SET foreign_key_checks = 0
陳述式。
如果您在空的 MyISAM
表格上使用 LOAD DATA
,則所有非唯一索引都會以單獨批次建立(如同 REPAIR TABLE
)。通常,這會讓在您有許多索引時,LOAD DATA
快很多。在某些極端情況下,您可以在將檔案載入表格之前,使用 ALTER TABLE ... DISABLE KEYS
將索引關閉,並在載入檔案之後使用 ALTER TABLE ... ENABLE KEYS
重新建立索引,這樣會更快地建立索引。請參閱 第 10.2.5.1 節,「最佳化 INSERT 陳述式」。
對於 LOAD DATA
和 SELECT ... INTO OUTFILE
陳述式,FIELDS
和 LINES
子句的語法相同。這兩個子句都是可選的,但如果同時指定,FIELDS
必須在 LINES
之前。
如果您指定 FIELDS
子句,它的每個子子句(TERMINATED BY
、[OPTIONALLY] ENCLOSED BY
和 ESCAPED BY
)也是可選的,但您必須至少指定其中一個。這些子句的引數只允許包含 ASCII 字元。
如果您沒有指定 FIELDS
或 LINES
子句,則預設值與您寫下此程式碼時相同
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY ''
反斜線是 SQL 陳述式中字串內的 MySQL 跳脫字元。因此,若要指定一個字面反斜線,您必須指定兩個反斜線,才能將該值解析為單個反斜線。跳脫序列 '\t'
和 '\n'
分別指定 Tab 和換行符號。
換句話說,當讀取輸入時,預設值會導致 LOAD DATA
的行為如下
在換行符號處尋找行界限。
不略過任何行首碼。
在 Tab 處將行分成欄位。
不期望欄位包含在任何引號字元中。
將前面有跳脫字元
\
的字元解析為跳脫序列。例如,\t
、\n
和\\
分別表示 Tab、換行和反斜線。如需完整跳脫序列清單,請參閱稍後關於FIELDS ESCAPED BY
的討論。
相反地,當寫入輸出時,預設值會導致 SELECT ... INTO OUTFILE
的行為如下
在欄位之間寫入 Tab。
不將欄位包含在任何引號字元中。
使用
\
來跳脫欄位值內發生的 Tab、換行或\
的執行個體。在行的末尾寫入換行符號。
對於在 Windows 系統上產生的文字檔,正確的檔案讀取可能需要 LINES TERMINATED BY '\r\n'
,因為 Windows 程式通常使用兩個字元作為行終止符號。某些程式,例如 WordPad,在寫入檔案時可能會使用 \r
作為行終止符號。若要讀取這類檔案,請使用 LINES TERMINATED BY '\r'
。
如果所有輸入行都有您想要忽略的通用首碼,您可以使用 LINES STARTING BY '
來略過首碼及其之前的任何內容。如果某一行不包含首碼,則會略過整行。假設您發出下列陳述式prefix_string
'
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test
FIELDS TERMINATED BY ',' LINES STARTING BY 'xxx';
如果資料檔案看起來像這樣
xxx"abc",1
something xxx"def",2
"ghi",3
產生的列會是 ("abc",1)
和 ("def",2)
。檔案中的第三列會被略過,因為它不包含首碼。
可以使用 IGNORE
子句來忽略檔案開頭的行。例如,您可以使用 number
LINESIGNORE 1 LINES
來略過包含欄名稱的初始標頭行
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;
當您將 SELECT ... INTO OUTFILE
與 LOAD DATA
搭配使用,將資料從資料庫寫入檔案,然後稍後將檔案讀回資料庫時,這兩個陳述式的欄位和行處理選項必須相符。否則,LOAD DATA
無法正確解析檔案的內容。假設您使用 SELECT ... INTO OUTFILE
來寫入以逗號分隔欄位的檔案
SELECT * INTO OUTFILE 'data.txt'
FIELDS TERMINATED BY ','
FROM table2;
若要讀取以逗號分隔的檔案,正確的陳述式如下
LOAD DATA INFILE 'data.txt' INTO TABLE table2
FIELDS TERMINATED BY ',';
如果改為嘗試使用下列顯示的陳述式讀取檔案,則不會運作,因為它會指示 LOAD DATA
尋找欄位之間的 Tab
LOAD DATA INFILE 'data.txt' INTO TABLE table2
FIELDS TERMINATED BY '\t';
可能的結果是,每個輸入行都會被解析為單個欄位。
LOAD DATA
可用於讀取從外部來源取得的檔案。例如,許多程式可以匯出以逗號分隔值 (CSV) 格式的資料,使得行的欄位以逗號分隔,並包含在雙引號內,且第一行是欄名稱。如果此類檔案中的行以歸位字元/換行符號對終止,則此處顯示的陳述式說明您將用來載入檔案的欄位和行處理選項
LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
如果輸入值不一定包含在引號中,請在 ENCLOSED BY
選項之前使用 OPTIONALLY
。
任何欄位或行處理選項都可以指定空字串 (''
)。如果不是空的,則 FIELDS [OPTIONALLY] ENCLOSED BY
和 FIELDS ESCAPED BY
值必須是單個字元。FIELDS TERMINATED BY
、LINES STARTING BY
和 LINES TERMINATED BY
值可以超過一個字元。例如,若要寫入以歸位字元/換行符號對終止的行,或讀取包含這類行的檔案,請指定 LINES TERMINATED BY '\r\n'
子句。
若要讀取包含以 %%
組成的行分隔的笑話的檔案,您可以這樣做
CREATE TABLE jokes
(a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
joke TEXT NOT NULL);
LOAD DATA INFILE '/tmp/jokes.txt' INTO TABLE jokes
FIELDS TERMINATED BY ''
LINES TERMINATED BY '\n%%\n' (joke);
FIELDS [OPTIONALLY] ENCLOSED BY
控制欄位的引號。對於輸出 (SELECT ... INTO OUTFILE
),如果您省略 OPTIONALLY
一詞,則所有欄位都會以 ENCLOSED BY
字元括起來。此處顯示此類輸出範例(使用逗號作為欄位分隔符號)
"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"
如果您指定 OPTIONALLY
,則 ENCLOSED BY
字元只會用來括住來自具有字串資料類型(例如 CHAR
、BINARY
、TEXT
或 ENUM
)的欄位的值
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20
欄位值內發生的 ENCLOSED BY
字元會在其前面加上 ESCAPED BY
字元來跳脫。此外,如果您指定空的 ESCAPED BY
值,可能會不小心產生 LOAD DATA
無法正確讀取的輸出。例如,如果跳脫字元為空白,則前面剛顯示的輸出會如下所示。請注意,第四行中的第二個欄位在引號後包含一個逗號,它(錯誤地)看起來像是終止欄位
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20
對於輸入,ENCLOSED BY
字元(如果存在)會從欄位值的末尾移除。(無論是否指定 OPTIONALLY
,情況皆如此;OPTIONALLY
對於輸入解析沒有任何影響。)前面有 ESCAPED BY
字元的 ENCLOSED BY
字元執行個體會被解析為目前欄位值的一部分。
如果欄位以 ENCLOSED BY
字元開頭,則只有在後面接著欄位或行 TERMINATED BY
序列時,才會將該字元的執行個體辨識為終止欄位值。為了避免模稜兩可,欄位值內發生的 ENCLOSED BY
字元可以加倍,並解析為該字元的單個執行個體。例如,如果指定 ENCLOSED BY '"'
,則會按照此處顯示的方式處理引號
"The ""BIG"" boss" -> The "BIG" boss
The "BIG" boss -> The "BIG" boss
The ""BIG"" boss -> The ""BIG"" boss
FIELDS ESCAPED BY
控制如何讀取或寫入特殊字元
對於輸入,如果
FIELDS ESCAPED BY
字元不是空的,則會移除該字元的執行個體,且後面的字元會按字面意義視為欄位值的一部分。有些雙字元序列是例外,其中第一個字元是跳脫字元。這些序列顯示在下表中(使用\
作為跳脫字元)。本節稍後會說明NULL
處理的規則。字元 跳脫序列 \0
ASCII NUL ( X'00'
) 字元\b
退格鍵字元 \n
換行(換行符號)字元 \r
歸位字元 \t
Tab 字元。 \Z
ASCII 26 (Control+Z) \N
NULL 如需有關
\
-跳脫語法的詳細資訊,請參閱 第 11.1.1 節,「字串常值」。如果
FIELDS ESCAPED BY
字元是空的,則不會發生跳脫序列解析。對於輸出,如果
FIELDS ESCAPED BY
字元不是空的,則會用來在輸出中加上下列字元的前置字元FIELDS ESCAPED BY
字元。FIELDS [OPTIONALLY] ENCLOSED BY
字元。如果
ENCLOSED BY
字元為空或未指定,則FIELDS TERMINATED BY
和LINES TERMINATED BY
值的第一個字元。ASCII
0
(在跳脫字元後面實際寫入的是 ASCII0
,而不是零值位元組)。
如果
FIELDS ESCAPED BY
字元為空,則不會逸出任何字元,且NULL
會輸出為NULL
,而不是\N
。指定空的逸出字元可能不是個好主意,特別是當您資料中的欄位值包含剛才列出的字元時。
在某些情況下,欄位和行處理選項會相互作用。
如果
LINES TERMINATED BY
是空字串且FIELDS TERMINATED BY
非空,則行也會以FIELDS TERMINATED BY
終止。如果
FIELDS TERMINATED BY
和FIELDS ENCLOSED BY
的值都為空(''
),則會使用固定列(無分隔符號)格式。使用固定列格式時,欄位之間不使用分隔符號(但您仍然可以有行終止符)。相反地,會使用足以容納欄位中所有值的欄位寬度來讀取和寫入欄位值。對於TINYINT
、SMALLINT
、MEDIUMINT
、INT
和BIGINT
,欄位寬度分別為 4、6、8、11 和 20,無論宣告的顯示寬度為何。LINES TERMINATED BY
仍然用於分隔行。如果某行未包含所有欄位,則其餘的欄位會設定為其預設值。如果您沒有行終止符,則應將其設定為''
。在這種情況下,文字檔必須包含每列的所有欄位。固定列格式也會影響
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
載入 NOT NULL
欄位會產生警告或錯誤。
有些情況不支援 LOAD DATA
。
固定大小的列(
FIELDS TERMINATED BY
和FIELDS ENCLOSED BY
皆為空)以及BLOB
或TEXT
欄位。如果您指定一個分隔符號與另一個分隔符號相同或為其前綴,
LOAD DATA
將無法正確解譯輸入。例如,以下FIELDS
子句會造成問題:FIELDS TERMINATED BY '"' ENCLOSED BY '"'
如果
FIELDS ESCAPED BY
為空,則包含FIELDS ENCLOSED BY
或LINES TERMINATED BY
的發生,後接FIELDS TERMINATED BY
值的欄位值會導致LOAD DATA
過早停止讀取欄位或行。發生這種情況是因為LOAD DATA
無法正確判斷欄位或行的值在哪裡結束。
以下範例會載入 persondata
表格的所有欄位:
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
預設情況下,當 LOAD DATA
陳述式的結尾未提供欄位清單時,輸入行預期會包含每個表格欄位的欄位。如果您只想載入表格的部分欄位,請指定欄位清單。
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata
(col_name_or_user_var [, col_name_or_user_var] ...);
如果輸入檔案中欄位的順序與表格中欄位的順序不同,您也必須指定欄位清單。否則,MySQL 無法判斷如何將輸入欄位與表格欄位比對。
在 LOAD DATA
語法中,每個 col_name_or_user_var
實例都是欄位名稱或使用者變數。使用使用者變數時,SET
子句可讓您在將結果指派給欄位之前,對其值執行預處理轉換。
SET
子句中的使用者變數可以多種方式使用。以下範例直接使用第一個輸入欄位作為 t1.column1
的值,並將第二個輸入欄位指派給使用者變數,該變數在用於 t1.column2
的值之前會進行除法運算:
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, @var1)
SET column2 = @var1/100;
SET
子句可用於提供不是從輸入檔案衍生的值。以下陳述式會將 column3
設定為目前的日期和時間:
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, column2)
SET column3 = CURRENT_TIMESTAMP;
您也可以透過將輸入值指派給使用者變數,而不將變數指派給任何表格欄位來捨棄輸入值。
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, @dummy, column2, @dummy, column3);
欄位/變數清單和 SET
子句的使用受以下限制約束:
SET
子句中的指派只能在指派運算子的左側有欄位名稱。您可以在
SET
指派的右側使用子查詢。傳回要指派給欄位的值的子查詢只能是純量子查詢。此外,您不能使用子查詢從正在載入的表格中選取。由
IGNORE
子句忽略的行不會針對欄位/變數清單或number
LINESSET
子句進行處理。使用固定列格式載入資料時,無法使用使用者變數,因為使用者變數沒有顯示寬度。
為了處理輸入行,LOAD DATA
會將其分割成欄位,並根據欄位/變數清單和 SET
子句(如果存在)使用這些值。然後,將產生的列插入表格中。如果表格有 BEFORE INSERT
或 AFTER INSERT
觸發器,則會在插入列之前或之後分別啟動它們。
欄位值的解譯和指派給表格欄位取決於以下因素:
SQL 模式(
sql_mode
系統變數的值)。該模式可以是無限制的,或以各種方式限制。例如,可以啟用嚴格 SQL 模式,或者該模式可以包含諸如NO_ZERO_DATE
或NO_ZERO_IN_DATE
之類的值。IGNORE
和LOCAL
修飾符的存在或缺失。
這些因素結合起來,會產生 LOAD DATA
的限制或非限制性資料解譯。
如果 SQL 模式具有限制性,且未指定
IGNORE
或LOCAL
修飾符,則資料解譯具有限制性。錯誤會終止載入作業。如果 SQL 模式沒有限制性,或者指定了
IGNORE
或LOCAL
修飾符,則資料解譯是沒有限制性的。(特別是,當省略REPLACE
修飾符時,如果指定了任一修飾符,則會覆寫具有限制性的 SQL 模式。)錯誤會變成警告,並且載入作業會繼續。
具有限制性的資料解譯使用以下規則:
過多或過少的欄位會導致錯誤。
將
NULL
(即\N
)指派給非NULL
欄位會導致錯誤。對於欄位資料類型而言,超出範圍的值會導致錯誤。
無效的值會產生錯誤。例如,數值欄位的
'x'
之類的值會導致錯誤,而不是轉換為 0。
相反地,非限制性的資料解譯使用以下規則:
如果輸入行有過多欄位,則會忽略額外的欄位,且警告數會遞增。
如果輸入行有過少的欄位,則會將遺失輸入欄位的欄位指派其預設值。預設值指派在 第 13.6 節「資料類型預設值」中說明。
將
NULL
(也就是\N
) 指派給非NULL
的欄位,會導致該欄位的資料類型被指派隱含的預設值。隱含的預設值在第 13.6 節「資料類型預設值」中有說明。無效的值會產生警告而不是錯誤,並會轉換為欄位資料類型「最接近」的有效值。範例:
數值欄位的值(例如
'x'
)會轉換為 0。超出範圍的數值或時間值會被裁剪為欄位資料類型範圍中最接近的端點。
對於
DATETIME
、DATE
或TIME
欄位的無效值,無論 SQL 模式NO_ZERO_DATE
設定為何,都會插入隱含的預設值。隱含的預設值是該類型適當的「零」值 ('0000-00-00 00:00:00'
、'0000-00-00'
或'00:00:00'
)。請參閱第 13.2 節「日期和時間資料類型」。
LOAD DATA
解釋空欄位值的方式與遺失欄位不同對於字串類型,欄位會設定為空字串。
對於數值類型,欄位會設定為
0
。對於日期和時間類型,欄位會設定為該類型適當的「零」值。請參閱第 13.2 節「日期和時間資料類型」。
只有當欄位有 NULL
值(也就是 \N
)且該欄位未宣告允許 NULL
值,或者如果 TIMESTAMP
欄位的預設值為目前的 timestamp 且在指定欄位清單時省略該欄位,TIMESTAMP
欄位才會設定為目前的日期和時間。
LOAD DATA
將所有輸入視為字串,因此您無法像使用 INSERT
陳述式一樣,使用數值來處理 ENUM
或 SET
欄位。所有 ENUM
和 SET
值都必須指定為字串。
無法使用二進位表示法(例如,b'011010'
)直接載入 BIT
值。為了解決這個問題,請使用 SET
子句來移除開頭的 b'
和結尾的 '
,並執行 2 進位到 10 進位的轉換,以便 MySQL 正確地將值載入 BIT
欄位中
$> cat /tmp/bit_test.txt
b'10'
b'1111111'
$> mysql test
mysql> LOAD DATA INFILE '/tmp/bit_test.txt'
INTO TABLE bit_test (@var1)
SET b = CAST(CONV(MID(@var1, 3, LENGTH(@var1)-3), 2, 10) AS UNSIGNED);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
mysql> SELECT BIN(b+0) FROM bit_test;
+----------+
| BIN(b+0) |
+----------+
| 10 |
| 1111111 |
+----------+
2 rows in set (0.00 sec)
對於 0b
二進位表示法(例如 0b011010
)中的 BIT
值,請改用此 SET
子句來移除開頭的 0b
SET b = CAST(CONV(MID(@var1, 3, LENGTH(@var1)-2), 2, 10) AS UNSIGNED)
LOAD DATA
支援使用 PARTITION
子句來明確選取分割區,其中包含一個或多個以逗號分隔的分割區、子分割區或兩者的名稱。當使用此子句時,如果檔案中的任何資料列無法插入清單中命名的任何分割區或子分割區,陳述式將會失敗,並顯示錯誤 找到不符合給定分割區集的資料列。如需更多資訊和範例,請參閱第 26.5 節「分割區選取」。
使用 LOW_PRIORITY
修飾詞,LOAD DATA
陳述式的執行會延遲,直到沒有其他用戶端從資料表中讀取資料為止。這只會影響僅使用資料表層級鎖定的儲存引擎(例如 MyISAM
、MEMORY
和 MERGE
)。
使用 CONCURRENT
修飾詞和符合並行插入條件(也就是說,中間沒有可用區塊)的 MyISAM
資料表,其他執行緒可以在執行 LOAD DATA
時從資料表中擷取資料。即使在同一時間沒有其他執行緒使用資料表,此修飾詞也會稍微影響 LOAD DATA
的效能。
當 LOAD DATA
陳述式完成時,它會傳回以下格式的資訊字串
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
發生警告的情況與使用 INSERT
陳述式插入值時相同(請參閱第 15.2.7 節「INSERT 陳述式」),但 LOAD DATA
在輸入資料列中的欄位太少或太多時也會產生警告。
您可以使用 SHOW WARNINGS
來取得前 max_error_count
個警告的清單,以瞭解發生錯誤的原因。請參閱第 15.7.7.41 節「SHOW WARNINGS 陳述式」。
如果您使用 C API,您可以呼叫 mysql_info()
函數來取得陳述式的相關資訊。請參閱 mysql_info()。
LOAD DATA
被認為對於以陳述式為基礎的複寫是不安全的。如果您使用 LOAD DATA
搭配 binlog_format=STATEMENT
,則每個要套用變更的複本都會建立一個包含資料的暫存檔案。即使來源上啟用了二進位記錄加密,此暫存檔案也不會加密。如果需要加密,請改用以資料列為基礎或混合二進位記錄格式,複本不會建立暫存檔案。如需有關 LOAD DATA
和複寫之間互動的更多資訊,請參閱第 19.5.1.20 節「複寫和 LOAD DATA」。
在 Unix 上,如果您需要 LOAD DATA
從管道讀取資料,您可以使用以下技巧(範例會將 /
目錄的清單載入資料表 db1.t1
)
mkfifo /mysql/data/db1/ls.dat
chmod 666 /mysql/data/db1/ls.dat
find / -ls > /mysql/data/db1/ls.dat &
mysql -e "LOAD DATA INFILE 'ls.dat' INTO TABLE t1" db1
在這裡,您必須在個別的終端機上執行產生要載入資料的命令和 mysql 命令,或在背景中執行資料產生程序(如前面的範例所示)。如果您不這麼做,管道將會阻塞,直到 mysql 程序讀取資料為止。