utf8mb4_general_ci(或 utf8mb4_unicode_ci)

-- 庫級
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
-- 表級(含列級聯轉換)
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 僅修改表默認,不轉換現有列
ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- PHP (mysql_* 已棄用,示例用 mysqli/PDO)
$mysqli->set_charset('utf8mb4');
$pdo = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', 'u', 'p');
-- Java
jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=false
-- Python
conn = pymysql.connect(charset='utf8mb4')
-- Go
dsn := "user:pass@tcp(host:3306)/db?charset=utf8mb4&parseTime=True&loc=Local"
| 現象 | 根因 | 修正 |
|---|---|---|
| 存入正常,查出亂碼 | 連接層未 SET NAMES | 連接建立後立即執行 SET NAMES utf8mb4 |
| Emoji 存入變 ?? | 字符集為 utf8 (utf8mb3) | 全鏈路升級 utf8mb4 |
| phpMyAdmin 顯示正常,應用亂碼 | 應用連接字符集錯誤 | 檢查驅動版本、連接參數 |
| Latin1 歷史庫遷移 | 雙重編碼 (Latin1→UTF8→Latin1) | ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 一步到位 |
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
SHOW CREATE TABLE tbl_name\G
編碼問題 90% 發生在連接層。建立連接後第一條語句必須是 SET NAMES utf8mb4(或驅動原生 charset 參數),將其封裝在連接池初始化/中間件中,杜絕手動調用遺漏。