字符集不一致是亂碼、索引失效、排序錯誤的高發區。本文系統整理庫/表/列三級字符集查看與修改命令,含 utf8/utf8mb4 選型建議與避坑指南。
| 對象 | 命令 | 關鍵輸出 |
|---|---|---|
| 數據庫 | SHOW CREATE DATABASE db_name; | DEFAULT CHARACTER SET utf8mb4 |
| 表 | SHOW CREATE TABLE tbl_name; | DEFAULT CHARSET=utf8mb4 |
| 列 | SHOW FULL COLUMNS FROM tbl_name; | Collation: utf8mb4_general_ci |
| 系統級 | SHOW VARIABLES LIKE 'character_set_%'; | server/database/client/connection/results 等 |
-- 模式 A:僅修改表默認字符集(新列生效),不轉換現有列 ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 模式 B:轉換表中所有字符列(CHAR/VARCHAR/TEXT)至新字符集(含數據重寫) ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
生產環境必用模式 B,否則新舊列字符集混用導致隱式轉換、索引失效。
特性 utf8 (utf8mb3) utf8mb4 最大字節/字符 3 字節 4 字節 支持字符範圍 BMP 基本多文種平面(無 Emoji、生僻漢字) 完整 Unicode(含 Emoji、生僻字、補充平面) 索引長度限制 767 字節(InnoDB 紅線) 767 字節(5.7.7+ 可配置 3072) 推薦度 ❌ 棄用 ✅ **新項目強制、舊項目遷移** 遷移建議:
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;(8.0+ 推薦排序規則,支援加權排序)。四、排序規則選型
_general_ci:通用、速度快、不精準(如 ß=ss、œ=oe)。_unicode_ci / _0900_ai_ci:UCA 標準、精準、稍慢,**業務推薦**。_bin:二進制比較、區分大小寫/重音、用於精確匹配/密碼列。DEFAULT CHARACTER SET 以為轉換了數據 → 實際未動數據。VARCHAR(255) utf8mb4 最大 1020 字節,超 767 字節無法建唯一索引(需 innodb_large_prefix=ON + ROW_FORMAT=DYNAMIC/COMPRESSED)。SET NAMES utf8mb4 / JDBC URL characterEncoding=utf-8,否則存入亂碼。