CSV 作為通用資料交換格式,MySQL 匯出入 CSV 是高頻運維操作。本文整理三種主流方式,涵蓋權限需求、效能特性與避坑細節,助您按場景選型。
SELECT * FROM `test_info`
INTO OUTFILE '/tmp/test.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n';
FILE 權限,MySQL 服務進程對目標目錄有寫入權限。secure_file_priv 指定目錄(查詢 SHOW VARIABLES LIKE 'secure_file_priv';)。LOAD DATA INFILE '/tmp/test.csv'
INTO TABLE `test_info`
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES; -- 若 CSV 含標題列
secure_file_priv 與 FILE 權限限制。LOCAL 關鍵字:LOAD DATA LOCAL INFILE 讓客戶端讀取檔案並傳送給伺服器,繞過伺服器端檔案權限,但需客戶端與伺服器均啟用 local_infile=1。mysqldump -u root -p --tab=/tmp --fields-terminated-by=',' \
--fields-enclosed-by='"' --fields-escaped-by='"' \
--lines-terminated-by='\r\n' --no-create-info \
db_name table_name
--tab 輸出兩檔:.txt(資料)、.sql(建表語句)。--no-create-info 僅輸出資料。secure_file_priv 限制。優勢: 無需命令列權限、支援瀏覽器直接下載、視覺化選項豐富。
劣勢: 受 PHP memory_limit、max_execution_time、upload_max_filesize 限制,**超過 10-50 萬筆易逾時/記憶體溢位**。
| 場景 | 解決方案 |
|---|---|
| 大表分卷匯出 | 配合 WHERE id BETWEEN ... AND ... 分批 INTO OUTFILE,再合併檔案 |
| 指定欄位順序/別名 | SELECT col1 AS 'Column1', col2 ... INTO OUTFILE ... |
| 處理 NULL 值 | FIELDS ESCAPED BY '\\' NULL AS 'NULL' 或應用層 COALESCE(col, '') |
| 編碼轉換(UTF-8 → Big5) | 匯出後用 iconv -f utf8 -t big5 test.csv > test_big5.csv |
| Windows 換行符 | LINES TERMINATED BY '\r\n'(匯出)、匯入時同樣指定 |
| CSV 含逗號/引號 | OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' 標準 RFC 4180 格式 |
| 方式 | 耗時 | CPU/記憶體 | 適用規模 |
|---|---|---|---|
| INTO OUTFILE | ~8 秒 | 低/低 | 億級以上 |
| mysqldump --tab | ~12 秒 | 中/低 | 千萬級 |
| phpMyAdmin | ~45 秒 + 下載 | 高/高 | 百萬級以下 |
INTO OUTFILE + 定時腳本,配合 secure_file_priv 專用目錄。mysqldump --tab 或 LOAD DATA LOCAL INFILE 避開檔案權限。SELECT COUNT(*)、關鍵欄位 SUM/MAX/MIN 對比來源,確保無損。掌握三種方式優劣,依權限、資料量、自動化需求靈活切換,讓 MySQL CSV 匯出入不再是阻礙。