SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
重點觀察:character_set_server、character_set_database、character_set_client/connection/results。
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
systemctl restart mysqld 生效。
ALTER DATABASE `db_name` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-- 僅修改表預設字元集 (不轉換現有欄位資料)
ALTER TABLE `tbl_name` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-- 【關鍵】完整轉換:結構 + 現有資料重新編碼
ALTER TABLE `tbl_name` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
⚠️ 必先備份! CONVERT TO 會重寫全表資料,大表耗時長、鎖表久。
ALTER TABLE `tbl_name`
MODIFY `col_name` VARCHAR(255) 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;
JDBC URL 範例:jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=false
| 現象 | 原因 | 解決 |
|---|---|---|
| 插入中文變 ??? / | 連線字元集非 utf8mb4 (如 latin1) | 應用啟動執行 SET NAMES utf8mb4 |
| 查詢結果顯示亂碼 | character_set_results 錯誤 | 同上,或 JDBC 加 characterEncoding |
| LIKE '%中文%' 查不到 | 連線/資料庫字元集不一致 | 統一全鏈路 utf8mb4 |
| Emoji 儲存截斷/報錯 | 使用 utf8 (僅 3 bytes) 而非 utf8mb4 (4 bytes) | 全鏈路升級 utf8mb4 |
| 舊資料已是 latin1 存中文 | 雙重編碼 (latin1 → utf8mb4 解碼錯誤) | CONVERT TO 或程式讀出再寫入 |
SHOW CREATE TABLE tbl_name 確認 CHARSET=utf8mb4SELECT HEX(col), col FROM tbl WHERE col LIKE '%中文%' 檢查位元模式head -c 500 backup.sql | file - 確認 UTF-8 編碼