MySQL 採四層預設值繼承機制:
伺服器預設 → 資料庫預設 → 資料表預設 → 欄位實際
修改上層不影響已建立的下層物件,只影響後續新建物件。
-- 修改資料庫預設字元集(僅影響後續新建表) ALTER DATABASE db_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 方案 A:僅修改表預設字元集(不轉換現有欄位) ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 方案 B:完整轉換(表預設 + 所有字串欄位資料重新編碼)⭐ 推薦 ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
差異關鍵:
DEFAULT CHARACTER SET:只改預設,現有 CHAR/VARCHAR/TEXT 欄位不變CONVERT TO:將所有字串欄位資料按新字元集重新編碼,資料實際改變-- 修改單一欄位字元集(需重複指定型別與長度)
ALTER TABLE tbl_name
CHANGE col_name col_name VARCHAR(100)
CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
| 層級 | 指令 | 關鍵輸出欄位 |
|---|---|---|
| 資料庫 | SHOW CREATE DATABASE db_name; | DEFAULT CHARACTER SET, DEFAULT COLLATE |
| 資料表 | SHOW CREATE TABLE tbl_name; | DEFAULT CHARSET, 表選項 |
| 欄位 | SHOW FULL COLUMNS FROM tbl_name; | Collation 欄位(NULL 表繼承表預設) |
| 伺服器 | SHOW VARIABLES LIKE 'character_set%'; | character_set_server, character_set_database |
ALTER DATABASE legacy_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'legacy_db' AND TABLE_TYPE = 'BASE TABLE';
# 檢查大表
mysql -e "SELECT TABLE_NAME, ROUND(DATA_LENGTH/1024/1024,2) AS size_mb
FROM information_schema.TABLES WHERE TABLE_SCHEMA='legacy_db' ORDER BY size_mb DESC;"
# 大表用 pt-online-schema-change 線上轉換
pt-online-schema-change --alter="CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" \
D=legacy_db,t=large_table --execute
-- 檢查是否有殘留非 utf8mb4 欄位
SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'legacy_db'
AND CHARACTER_SET_NAME != 'utf8mb4'
AND DATA_TYPE IN ('char','varchar','text','enum','set');
utf8 實為 utf8mb3(最多 3 字節),無法儲存 Emoji、生僻字,必須用 utf8mb4Illegal mix of collations 錯誤utf8mb4 每字元 4 字節,VARCHAR(255) 索引長度 1020 字節,超過 InnoDB 767 字節(舊版)或 3072 字節(新版)限制 → 需縮短長度或升級 innodb_large_prefix=ONCONVERT TO 若目標字元集無法表示原字元,會報錯或替換為 ?,轉換前必須備份characterEncoding=utf8mb4、PHP SET NAMES utf8mb4、Python charset='utf8mb4'| 場景 | CHARACTER SET | COLLATE | 說明 |
|---|---|---|---|
| 通用現代應用 | utf8mb4 | utf8mb4_general_ci | 效能較好、不區分大小寫、支援 Emoji |
| 需精準排序(多語言) | utf8mb4 | utf8mb4_unicode_ci | 遵循 Unicode 標準排序、稍慢 |
| 區分大小寫/重音 | utf8mb4 | utf8mb4_bin / utf8mb4_0900_as_cs | 二進制比較 / Unicode 9.0 區分大小寫重音 |