LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number LINES]
[(col_name_or_user_var, ...)]
[SET col_name = expr, ...]
| 子句 | 預設值 | 說明 |
|---|---|---|
| FIELDS TERMINATED BY | '\t' | 欄位分隔符,常用 ','、'|' |
| FIELDS ENCLOSED BY | '' | 欄位包裹字元,常用 '"'" |
| FIELDS ESCAPED BY | '\\' | 跳脫字元 |
| LINES TERMINATED BY | '\n' | 行結束符,Windows 用 '\r\n' |
| LINES STARTING BY | '' | 行前綴,可跳過固定開頭 |
| IGNORE n LINES | 0 | 跳過前 n 行(如標題列) |
| LOCAL | 無 | 從客戶端讀取檔案,無需 FILE 權限,速度稍慢 |
| REPLACE / IGNORE | 錯誤 | 主鍵衝突時:REPLACE 覆蓋、IGNORE 跳過 |
錯誤做法:檔案內容為 INSERT INTO t (a,b) VALUES (1,'x'),(2,'y');
正確做法:檔案只需純資料,每行一筆,欄位對應表結構:
1,"x"
2,"y"
預設是 Tab 分隔、無包裹。若資料含逗號、引號,必須明確指定:
LOAD DATA LOCAL INFILE 'data.csv'
INTO TABLE t
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\r\n';
現象:無 LOCAL 時,檔案必須在伺服器 datadir 或全域可讀目錄,且需 FILE 權限。
解法:
LOCAL 關鍵字 → 從客戶端讀取,無需伺服器權限。/var/lib/mysql-files/(需 secure_file_priv 允許)。\r\n 未處理Windows 產出的文字檔結尾為 \r\n,必須指定 LINES TERMINATED BY '\r\n',否則最後一欄會殘留 \r。
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, @var1)
SET column2 = @var1 / 100;
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);
ALTER TABLE t DISABLE KEYS;(僅 MyISAM)ALTER TABLE t ENABLE KEYS;bulk_insert_buffer_size、innodb_flush_log_at_trx_commit=2 臨時放寬。兩者欄位/行處理選項必須完全一致,才能正確往返匯出入。
| 錯誤 | 原因 | 解決 |
|---|---|---|
| Errcode: 13 | 檔案權限/路徑/secure_file_priv | 加 LOCAL、調整 secure_file_priv、檔案放正確目錄 |
| Errcode: 2 | 檔案不存在 | 確認相對/絕對路徑、LOCAL 時相對客戶端啟動目錄 |
| Incorrect string value | 字元集不匹配 | 檔案存為 UTF-8、設定 SET NAMES utf8mb4 |
| Duplicate entry | 主鍵/唯一鍵衝突 | 加 REPLACE 或 IGNORE |
FIELDS 與 LINES 所有子句,避免預設值誤判。LOCAL,避免伺服器權限與路徑問題。SHOW WARNINGS。掌握以上細節,LOAD DATA INFILE 即可成為你最高效、最穩定的大量資料匯入利器。