在將 Windows 環境導出的 SQL 檔案導入 Linux (Ubuntu/CentOS) MySQL 時,中文內容出現亂碼。這是典型的字符集不匹配問題。
# Windows 環境
mysqldump -u root -p --default-character-set=utf8mb4 資料庫名稱 > backup.sql
# Linux 環境
mysqldump -u root -p --default-character-set=utf8mb4 資料庫名稱 > /path/backup.sql
# 進入 MySQL 客戶端並指定編碼
mysql -u root -p --default-character-set=utf8mb4
# 在 MySQL 內部執行
USE 資料庫名稱;
SOURCE /path/backup.sql;
-- 查看資料庫編碼
SHOW CREATE DATABASE 資料庫名稱;
-- 查看表編碼
SHOW CREATE TABLE 表名稱;
-- 查看欄位編碼
SHOW FULL COLUMNS FROM 表名稱;
-- 轉換表編碼 (會重建表,大表慎用)
ALTER TABLE 表名稱 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 僅修改表預設編碼 (不影響現有欄位)
ALTER TABLE 表名稱 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SELECT * FROM 表名稱 WHERE 中文欄位 LIKE '%測試%';
-- 若能正常查詢並顯示中文,則導入成功
character-set-server=utf8mb4SET NAMES utf8mb4| 現象 | 可能原因 | 解決方法 |
|---|---|---|
| 導入後中文變 ??? | 導出編碼非 UTF-8 | 重新導出並指定 --default-character-set=utf8mb4 |
| 導入報錯 "Incorrect string value" | 目標表編碼不支援該字符 | ALTER TABLE CONVERT TO utf8mb4 |
| source 導入卡住無反應 | 大檔案超過 max_allowed_packet | 調大 max_allowed_packet 或分檔導入 |