萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL SELECT INTO OUTFILE 導出 Excel/CSV/TXT 完整教學與權限排錯

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)

實戰範例

1. 導出全表為 CSV(含標題列技巧)

-- 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');

2. 條件導出(指定欄位、篩選資料)

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';

3. 導出給 Excel 開啟(解決中文亂碼)

MySQL 預設以 UTF-8 寫入檔案,Excel 開啟 CSV 可能誤判編碼。兩種解法:

  1. 匯入而非雙擊開啟:Excel → 資料 → 從文字/CSV → 選擇 UTF-8 編碼匯入。
  2. 轉碼為 GB2312/GBK(Linux 下):
    iconv -f utf-8 -t gbk -o users_gbk.csv users_utf8.csv

Linux 權限錯誤排查:Can't create/write to file (Errcode: 13/2)

原因:AppArmor/SELinux 限制 MySQL 寫入非預設目錄。

方案一:修改 AppArmor 設定(Ubuntu/Debian)

sudo vim /etc/apparmor.d/usr.sbin.mysqld
# 在區塊內新增允許目錄
/data/ r,
/data/** rw,
# 重新載入
sudo systemctl reload apparmor
sudo systemctl restart mysql

方案二:修改 SELinux 設定

# 臨時關閉(測試用)
setenforce 0
# 永久允許 mysqld 寫入特定目錄
semanage fcontext -a -t mysqld_db_t "/data/mysql_export(/.*)?"
restorecon -Rv /data/mysql_export

方案三:使用 MySQL 預設 secure_file_priv 目錄

SHOW VARIABLES LIKE 'secure_file_priv';
-- 輸出範例:/var/lib/mysql-files/
-- 直接導出至此目錄無需改權限
SELECT * FROM users INTO OUTFILE '/var/lib/mysql-files/users.csv' ...

Windows 環境注意事項

  • 路徑使用正斜線 / 或雙反斜線 \\:'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 限制導出目錄,防止任意寫入檔案系統。
  • 導出檔案不可覆蓋既有檔(MySQL 會報錯),需先刪除或更換檔名。
  • 生產庫導出大量資料會佔用磁碟 IO,建議離峰時段或從庫執行。
copyright © 萬盛學電腦網 all rights reserved