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

MySQL CSV 導入導出中文亂碼終極解決方案

     編輯:MySQL 資料庫相關知識

核心語法速查

導出 (SELECT ... INTO OUTFILE)

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

權限要求:需 FILE 權限,目標目錄需受 secure_file_priv 限制 (查看:SHOW VARIABLES LIKE 'secure_file_priv';)。

導入 (LOAD DATA INFILE)

LOAD DATA INFILE '/tmp/import.csv'
INTO TABLE `table_name`
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n'  -- Windows 生成文件常為 CRLF
IGNORE 1 LINES;             -- 跳過標題行

中文亂碼三大成因與對策

場景成因解決方案
導出文件打開亂碼MySQL 按 utf8mb4 導出,Excel 默認用系統編碼 (GBK/ANSI) 打開1. 用 文本編輯器 另存為 UTF-8 BOM
2. Excel 數據 → 從文本/CSV → 選 UTF-8 編碼導入
3. 導出時指定 CHARACTER SET gbk (不推薦,有字符集損失)
導入數據庫存入亂碼文件編碼與表/連接字符集不一致1. 確保文件為 UTF-8 無 BOM
2. 會話執行 SET NAMES utf8mb4;
3. 表欄位為 utf8mb4
4. 配置文件全鏈路 utf8mb4 (見專題文章)
字段包含逗號/換行/引號未正確處理轉義與包圍必须使用 OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"',且程序生成 CSV 時按 RFC 4180 標準雙引號轉義

生產環境最佳實踐配置

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
secure_file_priv = /data/mysql_files/  # 統一導入導出目錄,便於管理與安全審計
systemctl restart mysqld

大文件分片導入導出技巧

  1. 分片導出:SELECT ... WHERE id BETWEEN 1 AND 100000 INTO OUTFILE ... 循環分批,避免單文件過大導致磁碟/傳輸問題。
  2. 並行導入:將大文件切分 (split -l 100000),多線程並行 LOAD DATA,配合 SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0; SET AUTOCOMMIT=0; 批量提交,導入後恢復檢查。
  3. 壓縮傳輸:導出後 gzip export.csv,跨機房傳輸解壓再導入。

替代方案:更強大的工具

  • mydumper/myloader:多線程邏輯備份/恢復,支援壓縮、一致性快照、斷點續傳,遠超 mysqldump/LOAD DATA 效能。
  • csvkit / Python pandas:複雜 CSV 清洗、轉碼、類型推斷,預處理後再導入。
  • LOAD DATA LOCAL INFILE:客戶端讀取本地文件上傳,無需 FILE 權限與服務端目錄權限,需客戶端與服務端均啟用 local_infile=1。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved