亂碼本質是匯出端與匯入端字元集不一致。核心鐵律:**全鏈路(資料庫、表、連線、檔案、客戶端)統一同一字元集**。
# 匯出
mysqldump -uroot -p --default-character-set=utf8 db table > bak.sql
# 匯入
mysql -uroot -p --default-character-set=utf8 db < bak.sql
mysql> SET character_set_database = utf8;
mysql> SELECT * FROM table INTO OUTFILE 'C:/table.txt' WHERE ...;
mysql> SET character_set_database = utf8;
mysql> LOAD DATA LOCAL INFILE '/home/table.txt' INTO TABLE `table`;
my.cnf/my.ini)
[mysql]
default-character-set = gbk # 或 utf8,視環境而定
[mysqld]
character-set-server = utf8
重啟服務後重新匯入,若仍亂碼,檢查 SHOW VARIABLES LIKE 'char%' 確認雙端一致。
SHOW VARIABLES LIKE 'char%';
-- 重點對齊:character_set_client、connection、database、results、server
mysqldump 必須加 --default-character-set,否則用預設值(常為 latin1)cmd 預設代碼頁 936 (GBK),PowerShell 預設 UTF-8,導出導入工具編碼必須匹配LOAD DATA 若無 LOCAL 關鍵字,檔案需置於 Server 端且受 secure_file_priv 限制CHARSET=)僅影響新建欄位,既有資料需 ALTER TABLE ... CONVERT TO CHARACTER SET匯出編碼 = 匯入編碼 = 資料庫儲存編碼 = 連線編碼 = 檔案編碼,五者合一,亂碼自消。