Linux (utf8) 匯出 → Windows (gbk) 匯入導致中文亂碼、連線失敗。核心解法:**匯出與匯入強制指定相同字元集**,推薦 utf8mb4 (支援 Emoji、完整 Unicode)。
utf8 (實為 utf8mb3)gbk/cp936mysqldump -u root -p \
--default-character-set=utf8mb4 \
--hex-blob \
--single-transaction \
dbname [tablename] > backup.sql
--hex-blob:二進位欄位 (BLOB/BINARY) 以十六進位輸出,避免編碼損壞--single-transaction:InnoDB 一致性快照,不鎖表mysql -u root -p \
--default-character-set=utf8mb4 \
dbname < backup.sql
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,徹底杜絕亂碼。