MySQL 原生 SELECT ... INTO OUTFILE 是導出數據最直接、性能最高的方式,但生成的是純文本(TSV/CSV),非真正的 .xls/.xlsx。本文實測導出流程、編碼陷阱、以及輔助工具方案對比。
USE test;
SELECT * FROM i_student INTO OUTFILE 'd:/1.xls';


點「是」後正常顯示數據:

FILE 權限(GRANT FILE ON *.* TO user@host;)。secure_file_priv 限制目錄(SHOW VARIABLES LIKE 'secure_file_priv';)。UNION SELECT 'col1','col2' ... 技巧。character_set_filesystem 寫入,建議服務端/連接均為 UTF-8。SELECT * FROM i_student
INTO OUTFILE '/tmp/student.csv'
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\r\n';
(SELECT 'id', 'name', 'age')
UNION ALL
(SELECT id, name, age FROM i_student)
INTO OUTFILE '/tmp/student_with_header.csv'
FIELDS TERMINATED BY ',' ENCLOSED BY '"';
SELECT s.name, c.class_name
FROM i_student s
JOIN i_class_student cs ON s.id=cs.student_id
JOIN i_class c ON cs.class_id=c.id
WHERE c.id=1
INTO OUTFILE '/tmp/class1_students.csv'
FIELDS TERMINATED BY ',';
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| INTO OUTFILE | 零依賴、極快、服務端直寫 | 需 FILE 權限、無表頭/格式、路徑受限 | 大數據量定時導出、ETL 落地、跨機器遷移 |
| mysqldump --tab | 官方工具、自動建表 SQL + 數據文件 | 需停寫或單線程、同樣無表頭 | 庫表遷移、備份歸檔 |
| MySQL Workbench / DBeaver / Navicat | GUI 操作、真 .xlsx、含表頭/格式/公式 | 大數據量極慢、易 OOM、走網絡傳輸 | 小數據集(<10萬行)人工分析、報表 |
| Python pandas / Go xlsx | 可編程、真 .xlsx、流式寫入、內存可控 | 需開發維護腳本 | 自動化報表、定時推送、複雜格式要求 |
INTO OUTFILE 生成 CSV → 壓縮 → 下載/傳輸 → 下游系統加載。pandas.read_sql + to_excel(分塊寫入)或 openpyxl 流式模式。總結:INTO OUTFILE 是「數據搬運工」,工具導出是「報表生成器」。按場景選對工具,事半功倍。