萬盛學電腦網

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

解決 MySQL 匯入匯出中文亂碼:統一編碼 utf8mb4 的標準流程

Linux (utf8) 匯出 → Windows (gbk) 匯入導致中文亂碼、連線失敗。核心解法:**匯出與匯入強制指定相同字元集**,推薦 utf8mb4 (支援 Emoji、完整 Unicode)。

根因分析

  • Linux MySQL 預設 utf8 (實為 utf8mb3)
  • Windows 客戶端/預設字元集常為 gbk/cp936
  • 匯出時未指定字元集 → 以伺服器預設編碼寫入檔案
  • 匯入時未指定 → 客戶端預設編碼解讀 → 亂碼

標準化流程

1. 匯出 (明確指定 utf8mb4)

mysqldump -u root -p \
  --default-character-set=utf8mb4 \
  --hex-blob \
  --single-transaction \
  dbname [tablename] > backup.sql
  • --hex-blob:二進位欄位 (BLOB/BINARY) 以十六進位輸出,避免編碼損壞
  • --single-transaction:InnoDB 一致性快照,不鎖表

2. 匯入 (同樣指定 utf8mb4)

mysql -u root -p \
  --default-character-set=utf8mb4 \
  dbname < backup.sql

3. 驗證

mysql -u root -p --default-character-set=utf8mb4 -e "SELECT * FROM dbname.tbl LIMIT 1;"

進階:資料庫/表/欄位層級編碼統一

-- 資料庫級
ALTER DATABASE dbname CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- 表級 (含現有欄位轉換)
ALTER TABLE tblname CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 欄位級 (修正錯誤編碼儲存)
ALTER TABLE tblname CHANGE col col VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

常見誤區

誤區正確做法
只在 my.cnf 設定 character-set-server連線層 (client/connection/results) 也需一致,建議客戶端連線字串加 charset=utf8mb4
用 utf8 (utf8mb3)無法儲存 Emoji/補充字符,必須用 utf8mb4
匯出加編碼、匯入不加雙邊必須對稱指定
Windows 直接用記事本開 .sql 改編碼檔案過大易損壞,請用 Notepad++ / VS Code 轉碼或重新匯出

連線字串最佳實踐

-- JDBC
jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=false&serverTimezone=UTC

-- PHP PDO
$pdo = new PDO("mysql:host=host;dbname=db;charset=utf8mb4", $user, $pass);

-- Python PyMySQL
conn = pymysql.connect(host='host', user='user', password='pass', db='db', charset='utf8mb4')

**鐵律**:全鏈路 (伺服器、資料庫、表、欄位、連線、匯出入工具) 統一 utf8mb4,徹底杜絕亂碼。

copyright © 萬盛學電腦網 all rights reserved