將 CSV 匯入 MySQL 是常見的資料遷移與初始化任務,掌握編碼統一、欄位對應與 LOAD DATA INFILE 參數調校,能避免 90% 的匯入失敗。
0000-00-00。CREATE TABLE `target_table` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL,
`created_at` DATE NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
LOAD DATA INFILE '/path/to/file.csv'
INTO TABLE `target_table`
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(`name`, `created_at`);
| 參數 | 說明 |
|---|---|
LOCAL | 若指定,客戶端讀取檔案並傳送給伺服器;否則伺服器直接讀取伺服器端路徑 (需 FILE 權限) |
FIELDS TERMINATED BY | 欄位分隔符,CSV 固定為 ',' |
OPTIONALLY ENCLOSED BY | 欄位包圍字元,通常為雙引號 '"'"'" |
LINES TERMINATED BY | 換行符,Linux '\n'、Windows '\r\n' |
IGNORE 1 LINES | 跳過標題列 |
(col_list) | 指定對應欄位順序,CSV 欄位順序與資料表不同時必須指定 |
CHARACTER SET utf8mb4、資料表 DEFAULT CHARSET=utf8mb4、連線 SET NAMES utf8mb4 三者一致。ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option:將 CSV 放入 secure_file_priv 指定目錄,或啟用 LOCAL 由客戶端讀取。YYYY-MM-DD;若為其他格式,先匯入暫存表再用 STR_TO_DATE 轉換。SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; 匯入後恢復並 COMMIT。CREATE INDEX。pt-fifo-split 或自行切分多檔平行匯入。