前置準備
- 編碼統一:CSV 檔案另存為 UTF-8(或 UTF-8 with BOM),資料庫/表字元集設為
utf8mb4。
- 建表對應:依 CSV 欄位建立表結構,日期/時間欄位在 Excel 中設為「日期」格式,避免匯入變字串。
核心命令:LOAD DATA INFILE
LOAD DATA INFILE 'data.csv'
INTO TABLE target_table
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES; -- 跳過標題行
參數詳細說明
| 參數 | 說明 |
LOW_PRIORITY | 延遲執行直到無讀取鎖 |
LOCAL | 客戶端讀取檔案並傳給 Server(需客戶端與 Server 都啟用 local-infile) |
REPLACE / IGNORE | 主鍵/唯一鍵衝突時:替換 / 忽略 |
FIELDS TERMINATED BY | 欄位分隔符,CSV 用 ',' |
ENCLOSED BY | 欄位包圍字元,CSV 常用雙引號 |
ESCAPED BY | 跳脫字元,預設 \\ |
LINES TERMINATED BY | 行結束符,Windows '\r\n',Linux '\n' |
IGNORE n LINES | 跳過前 n 行(標題) |
(col1, col2, ...) | 指定匯入欄位順序,對應 CSV 欄位 |
權限要求
- 執行用戶需
FILE 權限:GRANT FILE ON *.* TO 'user'@'host';
secure_file_priv 限制匯入目錄:
SHOW VARIABLES LIKE 'secure_file_priv';
若為 /var/lib/mysql-files/,需將 CSV 放入該目錄;若為空則無限制(不建議)。
常見問題排查
- 資料截斷:欄位長度不足 → 擴大
VARCHAR 或用 TEXT。
- 日期格式錯誤:CSV 日期格式需與 MySQL 兼容(YYYY-MM-DD HH:MM:SS),或匯入後用
STR_TO_DATE 清洗。
- 中文亂碼:確認 CSV 編碼、
CHARACTER SET 參數、表字元集三者一致。
替代方案
- mysqlimport:
LOAD DATA 的命令列封裝,適合批次腳本。
- ETL 工具:DataX、Kettle、Airbyte 處理超大檔、異構源。
- 程式語言:Python
pandas.read_csv + to_sql / LOAD DATA LOCAL INFILE。