MySQL 原生 SELECT ... INTO OUTFILE 與 LOAD DATA INFILE 是高效處理 CSV 的核心工具。本文通過實戰案例深度解析參數含義、權限限制與常見坑點。
表 tt_address 擁有 40+ 欄位,需匯出 uid, name, gender, email, module_sys_dmail_html 至 CSV。
SELECT
`uid`, `name`, `gender`, `email`, `module_sys_dmail_html`
INTO OUTFILE 'd:/test7.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM `tt_address`;
| 子句 | 參數值 | 作用 | 範例輸出 |
|---|---|---|---|
| FIELDS TERMINATED BY | ',' | 欄位分隔符 | uid,name,gender... |
| OPTIONALLY ENCLOSED BY | '"' | 欄位包圍符(含特殊字元時自動加上) | "uid","name with,comma" |
| ESCAPED BY | '\\' | 跳脫字元(預設反斜線) | "He said \"Hi\"" |
| LINES TERMINATED BY | '\n' | 行結束符 | 行尾換行 |
uid,name,gender,email,module_sys_dmail_html
2,"aa",m,"tian.li@atop-online.de",0
LOAD DATA LOCAL INFILE 'e:/input1.csv'
INTO TABLE `test1`
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(`first_name`, `last_name`, `email`);
FILE 權限FILE 權限,受 local_infile=1 參數控制-- 指定欄位順序(CSV 欄位順序與表不一致時)
LOAD DATA INFILE 'data.csv'
INTO TABLE `users`
FIELDS TERMINATED BY ','
(`email`, `username`, @dummy, `phone`) -- @dummy 跳過第3欄
SET `created_at` = NOW(); -- 衍生欄位賦值
[mysqld]
secure_file_priv = /var/lib/mysql-files/ # 限制檔案操作目錄
local_infile = 1 # 允許 LOCAL 匯入
GRANT FILE ON *.* TO 'etl_user'@'%'; -- 僅授予 FILE 權限,非全權限
LOAD DATA INFILE 'data.csv'
INTO TABLE `t1`
IGNORE 1 LINES; -- 跳過第一行標題
-- CSV 中用 \N 表示 NULL
LOAD DATA INFILE 'data.csv'
INTO TABLE `t1`
FIELDS TERMINATED BY ','
NULL VALUES ARE REPRESENTED BY '\\N';
LOAD DATA INFILE 'data.csv'
INTO TABLE `t1`
IGNORE 1 LINES
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 10 LINES; -- 跳過前 10 行(如說明文字)
ALTER TABLE t DISABLE KEYS(MyISAM)/ SET FOREIGN_KEY_CHECKS=0,匯入後重建SET GLOBAL bulk_insert_buffer_size = 1024*1024*1024; (MyISAM) / innodb_log_file_size (InnoDB)LOAD DATADROP TRIGGER| 錯誤碼 | 訊息 | 原因 | 解決 |
|---|---|---|---|
| 1290 | The MySQL server is running with the --secure-file-priv option | 檔案路徑不在允許目錄 | 移動檔案至 secure_file_priv 目錄或修改配置 |
| 1045 | Access denied for user | 缺少 FILE 權限 | GRANT FILE ON *.* TO user |
| 29 | File not found | 路徑錯誤/權限不足 | 檢查路徑、OS 層面權限 |
| 1261 | Row N doesn't contain data for all columns | 欄位數不匹配 | 檢查 CSV 結構、指定欄位清單 |