字符集不一致是導致資料亂碼的核心原因。本文系統整理 Linux/Windows 下修改字符集的多種方式,並深入解析 MySQL 字符集架構與亂碼產生機制。
find / -name 'my*.cnf' -o -name 'my.ini'/etc/my.cnf:cp /usr/share/mysql/my-medium.cnf /etc/my.cnf/etc/my.cnf,在 [client] 與 [mysqld] 下新增:[client]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_cisystemctl restart mysqldSHOW VARIABLES LIKE 'character_set_%';SHOW VARIABLES LIKE 'collation_%';my.ini(若無則複製 my-medium.ini 並重命名)。[client] 與 [mysqld] 區塊加入:default-character-set=utf8mb4character-set-server=utf8mb4-- 建庫指定
CREATE DATABASE `mydb` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改資料庫
ALTER DATABASE `mydb` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改資料表
ALTER TABLE `mytable` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SET NAMES utf8mb4;
-- 等同於
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;
MySQL 字符集分四層:伺服器 → 資料庫 → 資料表 → 連線。預設若未指定,層層繼承 latin1,導致中文存儲錯誤。
亂碼兩大場景:
核心解決原則:客戶端、連線、結果三者字符集必須一致,且與資料存儲字符集匹配。
| 字符集 | 特點 | 適用場景 |
|---|---|---|
| utf8mb4 | 支援完整 Unicode(含 Emoji),3-4 字節/字 | 新專案首選,國際化系統 |
| utf8 | MySQL 早期實作,僅支援 BMP 平面(3 字節) | 舊系統相容 |
| gbk | 雙字節,支援簡繁中文,不支援多語言 | 純中文舊系統 |
| latin1 | 單字節,無中文支援 | 不建議使用 |
SHOW VARIABLES LIKE '%char%'; 確認四層字符集。characterEncoding=utf8mb4。SHOW CREATE TABLE)。utf8mb4。