MySQL LOAD DATA INFILE 直接讀 CSV 進引擎,速度比腳本解析快 **10-50倍**。關鍵在於精確對齊 FIELDS TERMINATED BY、ENCLOSED BY、LINES TERMINATED BY 三大參數與 RFC4180 標準。本文提供標準導入/導出模板與格式陷阱避坑指南。
LOAD DATA INFILE '/tmp/file.csv'
INTO TABLE `target_table`
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
| 參數 | RFC4180 標準 | MySQL 寫法 | 說明 |
|---|---|---|---|
| 字段分隔符 | 逗號 , | FIELDS TERMINATED BY ',' | 必須一致 |
| 引用字符 | 半角雙引號 " | ENCLOSED BY '"'" | 字符串必須被雙引號包圍 |
| 引用內雙引號轉義 | 兩個雙引號 "" | MySQL 自動識別 ENCLOSED BY 時 | |
| 行終止符 | \r\n (CRLF) | LINES TERMINATED BY '\r\n' | Linux產生可能為 \n,需對應 |
| 首行表頭 | 可選 | IGNORE 1 LINES | 跳過表頭 |
\r\n 分隔"He said ""Hi""")
SELECT * FROM `source_table`
INTO OUTFILE '/tmp/data.csv'
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n';
關鍵差異:導出用 OPTIONALLY ENCLOSED BY(僅字符串加引號),導入用 ENCLOSED BY(強制所有字段按引號解析)。**導入導出參數必須互為逆操作**。
| 坑點 | 現象 | 解決 |
|---|---|---|
| 行終止符不匹配 | 導入後所有數據擠在第一行,或最後一列含 \r | 用 file / hexdump -C 檢查文件換行符,調整 LINES TERMINATED BY |
| 引用字符不匹配 | 字段被截斷、溢出到下一字段 | 確認 CSV 是否嚴格 RFC4180,必要時預處理:sed 's/^/"\n/; s/$/"/' |
| 編碼不匹配 | 中文亂碼 | 導出導入雙端指定 CHARACTER SET utf8mb4,文件存 UTF-8 無 BOM |
| secure_file_priv 限制 | ERROR 1290: The MySQL server is running with the --secure-file-priv option | 文件放在 SHOW VARIABLES LIKE 'secure_file_priv'; 目錄下,或關閉該選項(需重啟) |
| 大文件導入慢 | 單事務、索引維護 | 導入前 SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;,分文件並行 |
LOAD DATA INFILE '/tmp/source.csv'
INTO TABLE `target_table`
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(col_csv_3, col_csv_1, @date_str, col_csv_5)
SET
target_col_a = col_csv_3,
target_col_b = col_csv_1,
target_col_c = STR_TO_DATE(@date_str, '%Y-%m-%d'),
target_col_d = col_csv_5;
掌握 LOAD DATA INFILE 參數與 RFC4180 對齊,讓 CSV 導入從「反復試錯」變為「一次成功」。