首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 導出 CSV 三大方案實測:INTO OUTFILE、sed 管道、mysqldump 參數法

     編輯:MySQL 資料庫相關知識

方案對比速覽

方案適用場景優點缺點
INTO OUTFILE全表導出、服務器本地純 SQL、性能最強需文件權限、難加 WHERE、難遠程導出
sed 管道帶條件導出、遠程客戶端靈活、支持複雜查詢需處理轉義、大數據慢
mysqldump -T表級導出、服務器本地官方工具、格式標準需目錄權限、不支持 WHERE

方案一:SELECT ... INTO OUTFILE(服務器端導出)

SELECT * FROM mytable
INTO OUTFILE '/tmp/mytable.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';

關鍵限制:

  • 目標文件**不能存在**(會報錯)
  • MySQL 進程用戶(通常 mysql)需對目錄有寫權限 → 推薦 /tmp/
  • **不支持 WHERE 子句**(官方文檔限制),只能全表導出
  • 需 FILE 權限:GRANT FILE ON *.* TO 'user'@'host';

方案二:mysql 命令 + sed 管道(客戶端導出,最靈活)

mysql -uroot -p test -e "SELECT ip FROM server WHERE a.name LIKE '%abc%'" -N -s | \
sed -e 's/^/"/g' -e 's/$/"/g' -e 's/\t/","/g' > /tmp/test.csv

參數解析:

  • -e:直接執行 SQL
  • -N:不輸出列名
  • -s:靜默模式(無表格框,Tab 分隔)

sed 轉義邏輯:

  1. s/^/"/g:行首加雙引號
  2. s/$/"/g:行尾加雙引號+換行
  3. s/\t/","/g:Tab 替換為 ","(CSV 標準分隔)

進階:多欄位處理

mysql -uroot -p db -e "SELECT id,name,email FROM users WHERE status=1" -N -s | \
awk -F'\t' '{printf "\"%s\",\"%s\",\"%s\"\n", $1, $2, $3}' > users.csv

方案三:mysqldump -T 參數(表級導出)

mysqldump -u username -p -t -T /path/to/dir dbname table_name \
  --fields-terminated-by=',' \
  --fields-enclosed-by='"' \
  --lines-terminated-by='\n'

生成文件:

  • /path/to/dir/table_name.txt:數據文件(CSV 格式)
  • /path/to/dir/table_name.sql:建表語句

要求:目標目錄需 MySQL 進程寫權限,通常配合 secure_file_priv 參數目錄。

生產環境選型建議

  1. 全表大數據(>100萬行):INTO OUTFILE 或 mysqldump -T(服務器端,避免網絡傳輸)
  2. 帶條件篩選/遠程導出:mysql -e ... | awk/sed(客戶端,靈活可控)
  3. 定時任務自動化:封裝為 Shell/Python 腳本,配合 crontab,導出後 gzip 壓縮上傳對象存儲

CSV 規範化避坑

  • 字段含逗號/換行/引號 → 必須 OPTIONALLY ENCLOSED BY '"' 並雙引號轉義
  • 編碼統一 UTF-8(含 BOM 兼容 Excel)
  • 大文件分卷:split -l 1000000 large.csv part_

沒有銀彈,**靈活性用管道法,性能用服務器端法**。建議團隊標準化一套導出腳本庫,參數化表名、條件、輸出路徑,複用率 90%+。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved