1. 前言
CSV(逗號分隔值,Comma Separated Values)是一種廣泛用於資料匯出、遷移與備份的格式。MySQL 提供將資料匯出為 CSV 格式的功能,對於高效的資料管理與分析非常有幫助。本文將詳細說明如何使用 MySQL 將資料匯出為 CSV,並介紹不同版本之間的差異、常見錯誤訊息的處理方式,以及與安全性相關的注意事項。
執行環境
本文以 MySQL 8.0 為基礎進行說明,但也會提及在使用 MySQL 5.x 系列時可能遇到的差異。由於不同版本的操作與設定可能有所不同,請依照實際使用的版本採取適當步驟。
2. 在 MySQL 匯出 CSV 的基本步驟
在 MySQL 中要將資料匯出為 CSV 格式,可以使用 SELECT INTO OUTFILE
指令。這是將查詢結果存成 CSV 檔案的標準方法。
2.1 基本語法
SELECT * FROM table_name INTO OUTFILE '/path/to/file.csv'
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 'n';
2.2 指令詳解
SELECT *
:選取資料表中的所有資料。若只需匯出特定欄位,可指定欄位名稱。INTO OUTFILE
:將查詢結果存成檔案,必須指定絕對路徑。FIELDS TERMINATED BY ','
:設定欄位之間的分隔符號為逗號。ENCLOSED BY '"'
:將每個欄位用雙引號包起來,避免資料內含有逗號或換行時出錯。LINES TERMINATED BY 'n'
:每行資料以換行分隔。在 Windows 環境中可使用'rn'
。

3. 版本依賴的差異
3.1 MySQL 5.x 與 8.x 的差異
在 MySQL 5.x 與 8.x 之間,有一些關鍵差異,特別是在編碼與檔案輸出功能方面,需要注意以下幾點:
- 編碼處理:
- MySQL 5.x 預設使用
utf8
編碼,但僅支援最多 3 位元組字元,無法正確處理 emoji 或部分特殊字元,因此建議改用utf8mb4
。但在 5.x 系列中支援較有限。 - MySQL 8.x 預設使用
utf8mb4
,能正確處理所有多位元組字元與 emoji。 secure_file_priv
強化:- 在 MySQL 8.x 中,
secure_file_priv
對檔案寫入的限制更加嚴格,若嘗試寫入未授權目錄會報錯。 - MySQL 5.x 也有相同設定,但限制較寬鬆,需要額外注意設定。
3.2 匯出 CSV 的效能
MySQL 8.x 在效能方面有明顯優化,特別是針對大規模資料的 CSV 匯出更快更有效率。5.x 雖然也能匯出 CSV,但速度與穩定性不如 8.x。
4. 匯出 CSV 時的注意事項
4.1 檔案寫入權限與 secure_file_priv
secure_file_priv
用來限制 MySQL 可存取的目錄,若未設定正確路徑會出現錯誤。可使用以下指令檢查:
SHOW VARIABLES LIKE 'secure_file_priv';
若未指定允許的目錄,可能會出現錯誤訊息。
4.2 編碼問題
若匯出的資料包含多位元組字元(如中文、emoji),應使用 utf8mb4
以確保正確輸出。MySQL 5.x 多使用 utf8
,但升級到 8.x 可避免許多編碼錯誤。

5. 常見錯誤訊息與解決方法
5.1 secure_file_priv
錯誤
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement.
此錯誤表示嘗試將檔案寫入未授權目錄,需改用允許的目錄或調整設定。
5.2 寫入權限錯誤
ERROR 13 (HY000): Can't get stat of '/path/to/file.csv' (Errcode: 13 - Permission denied)
這表示缺乏檔案寫入權限,可使用以下指令修正:
sudo chmod 755 /path/to/directory
安全提醒:避免使用 chmod 777
,因為會開放所有使用者的寫入權限,存在重大安全風險。
6. 其他安全性考量
6.1 檔案權限管理
在 MySQL 匯出 CSV 檔案時,應設定合理的檔案權限,避免開放過度權限。建議使用 chmod 755
,確保僅管理員或特定使用者可存取。
6.2 善用 secure_file_priv
secure_file_priv
是 MySQL 的重要安全設定,可限制資料存取目錄,降低資料外洩與惡意存取風險。建議在 MySQL 設定檔(my.cnf
或 my.ini
)中明確指定允許的目錄。

7. 總結
使用 MySQL 匯出 CSV 對於資料遷移與備份非常便利,但不同版本在功能與效能上存在差異。特別是 MySQL 8.x 在效能與安全性上均有提升,對編碼與目錄限制的處理更完善。
相較之下,MySQL 5.x 在 utf8
編碼與 secure_file_priv
的設定上較有限,需額外注意。建議優先使用 utf8mb4
並妥善設定檔案權限,以確保資料輸出安全。
此外,透過設定合理的檔案權限與 secure_file_priv
限制,可將資料外洩與未授權存取的風險降到最低。特別是在公開伺服器上,建議僅授權必要的使用者存取檔案。
7.1 實務重點整理
- 理解版本差異:熟悉 MySQL 5.x 與 8.x 的差別,特別是編碼與檔案輸出設定。
- 設定正確權限:避免過度授權,建議使用
chmod 755
,避免使用chmod 777
。 - 活用
secure_file_priv
:限制 MySQL 的存取目錄,降低安全風險。 - 檢查編碼:若輸出包含中文或 emoji,請務必使用
utf8mb4
。
依照以上重點操作,就能安全且高效地使用 MySQL 的 CSV 匯出功能。