MySQL 編碼分四級,優先級由高到低:
character_set_servercharacter_set_databaseDEFAULT CHARSETCHARACTER SET修改上層不影響已存在對象,僅作為新對象的默認值。
SHOW VARIABLES LIKE 'character_set_%'; SHOW VARIABLES LIKE 'collation_%';
SHOW VARIABLES LIKE 'character_set_database'; -- 或 SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='db_name';
SHOW CREATE TABLE table_name\G -- 輸出中 DEFAULT CHARSET=xxx
SHOW FULL COLUMNS FROM table_name; -- Collation 列顯示字符集與校對規則
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE TABLE tb_books (
name VARCHAR(45) NOT NULL,
price DOUBLE NOT NULL,
bookCount INT NOT NULL,
author VARCHAR(45) NOT NULL
) DEFAULT CHARSET = utf8mb4 COLLATE utf8mb4_general_ci;
CREATE TABLE t (
c1 VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
c2 VARCHAR(20) CHARACTER SET latin1
) DEFAULT CHARSET=utf8mb4;
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
ALTER TABLE table_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
-- 修改單列 ALTER TABLE table_name MODIFY col_name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 批量轉換全表所有字符列 (5.6+) ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CONVERT TO vs MODIFY:
CONVERT TO:重建表,轉換所有字符列數據,推薦用於編碼升級 (latin1→utf8mb4)MODIFY:僅修改列定義,不轉換現有數據,慎用
ALTER TABLE tb_product ADD CONSTRAINT fk_factory FOREIGN KEY (factoryid) REFERENCES tb_factory(factoryid);
ALTER TABLE tb_people DROP FOREIGN KEY fk_1;
| 特性 | utf8 (utf8mb3) | utf8mb4 |
|---|---|---|
| 最大字節數 | 3 bytes | 4 bytes |
| Emoji 支援 | ❌ | ✅ |
| 生僻字支援 | 部分 | 完整 Unicode |
| 索引長度限制 | 767 bytes | 767 bytes (需開啟 innodb_large_prefix) |
| 推薦場景 | 純英文/基礎中文 | 所有新項目 (默認推薦) |
編碼問題核心在於「存儲編碼與連接編碼一致」。新項目直接指定 utf8mb4,舊項目升級用 CONVERT TO CHARACTER SET utf8mb4 並同步修正應用層連接字符串 characterEncoding=utf8mb4。定期巡檢 SHOW VARIABLES LIKE 'character_set%' 確保各層級一致。