亂碼本質:匯出端與匯入端字符集不一致。Linux 預設 UTF-8,Windows 預設 GBK,跨平台遷移必須顯式指定字符集。
# 匯出 mysqldump -u root -p --default-character-set=utf8mb4 db_name > dump.sql # 匯入 mysql -u root -p --default-character-set=utf8mb4 db_name < dump.sql
mysql> SET NAMES utf8mb4; -- 或 SET character_set_database=utf8mb4;
mysql> SELECT * FROM tbl INTO OUTFILE 'C:/tbl.txt' CHARACTER SET utf8mb4
FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
SET NAMES utf8mb4; 後導入:mysql> LOAD DATA LOCAL INFILE '/home/tbl.txt' INTO TABLE tbl
CHARACTER SET utf8mb4
FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4'
重啟服務後,所有新連線預設即為 UTF-8。
-- 1. 建立暫存表,欄位設為 latin1 (透明載體) CREATE TABLE tmp_tbl (col VARCHAR(255) CHARACTER SET latin1) ENGINE=InnoDB; -- 2. 以 latin1 讀出原資料 (不轉碼) INSERT INTO tmp_tbl SELECT col FROM orig_tbl; -- 3. 修改欄位字符集為正確編碼 (MySQL 自動 latin1→utf8mb4 轉換) ALTER TABLE tmp_tbl MODIFY col VARCHAR(255) CHARACTER SET utf8mb4; -- 4. 覆蓋回原表 UPDATE orig_tbl o JOIN tmp_tbl t ON o.id=t.id SET o.col=t.col;
SHOW VARIABLES LIKE 'character_set_%'; SHOW VARIABLES LIKE 'collation_%';
確認 character_set_client、connection、database、results、server 皆為 utf8mb4。