MySQL 內建 SELECT ... INTO OUTFILE 語法可將查詢結果直接導出為文字檔(CSV、TSV、TXT),再用 Excel 開啟即可獲得表格檔。本文詳細說明語法參數、編碼處理、Linux 權限排錯與實戰範例。
SELECT * FROM table_name
INTO OUTFILE '/path/to/file.txt'
FIELDS TERMINATED BY ',' -- 欄位分隔符(預設 \t)
OPTIONALLY ENCLOSED BY '\"' -- 文字包裹字元(雙引號)
LINES TERMINATED BY '\n'; -- 換行符(Windows 用 \r\n)
-- MySQL 不直接支援導出標題,可用 UNION 技巧
(SELECT 'id', 'name', 'email', 'created_at')
UNION ALL
(SELECT id, name, email, created_at FROM users
INTO OUTFILE '/tmp/users.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n');
SELECT id, username, email
FROM users
WHERE status = 1 AND created_at > '2023-01-01'
INTO OUTFILE '/tmp/active_users.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n';
MySQL 預設以 UTF-8 寫入檔案,Excel 開啟 CSV 可能誤判編碼。兩種解法:
iconv -f utf-8 -t gbk -o users_gbk.csv users_utf8.csv
原因:AppArmor/SELinux 限制 MySQL 寫入非預設目錄。
sudo vim /etc/apparmor.d/usr.sbin.mysqld
# 在區塊內新增允許目錄
/data/ r,
/data/** rw,
# 重新載入
sudo systemctl reload apparmor
sudo systemctl restart mysql
# 臨時關閉(測試用)
setenforce 0
# 永久允許 mysqld 寫入特定目錄
semanage fcontext -a -t mysqld_db_t "/data/mysql_export(/.*)?"
restorecon -Rv /data/mysql_export
SHOW VARIABLES LIKE 'secure_file_priv';
-- 輸出範例:/var/lib/mysql-files/
-- 直接導出至此目錄無需改權限
SELECT * FROM users INTO OUTFILE '/var/lib/mysql-files/users.csv' ...
/ 或雙反斜線 \\:'C:/tmp/users.csv' 或 'C:\\tmp\\users.csv'LINES TERMINATED BY '\r\n'-- 分批導出,每批 10 萬筆
SELECT * FROM big_table WHERE id BETWEEN 1 AND 100000 INTO OUTFILE '/tmp/part1.csv' ...;
SELECT * FROM big_table WHERE id BETWEEN 100001 AND 200000 INTO OUTFILE '/tmp/part2.csv' ...;
secure_file_priv 限制導出目錄,防止任意寫入檔案系統。