MySQL 字符集鏈路:**Client → Connection → Server → Database → Table → Column**。任意一環不一致 (如 Client UTF8、Table Latin1) 即產生亂碼 ( / ? / 亂碼字符)。
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_general_ci skip-character-set-client-handshake # 強制忽略客戶端聲明,統一用 server 設置 [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4
重啟生效:systemctl restart mysqld
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 或修改現有庫 ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE TABLE t (c VARCHAR(100)) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 轉換現有數據
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=UTCcharset='utf8mb4'charset=utf8mb4 in DSNmysql --default-character-set=utf8mb4SHOW VARIABLES LIKE 'character_set_%'; +--------------------------+---------+ | Variable_name | Value | +--------------------------+---------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | +--------------------------+---------+
前 5 項必須均為 utf8mb4。
mysqldump --default-character-set=latin1 --skip-set-charset db > backup.sqlCHARSET=latin1 替換為 CHARSET=utf8mb4,COLLATE=latin1_swedish_ci → utf8mb4_general_ci。
3. 構建新庫 (UTF8MB4) 導入:mysql --default-character-set=utf8mb4 db < backup.sql
4. 驗證數據完整性。
utf8 (MySQL 別名 utf8mb3):最多 3 字節,**不支援 Emoji、生僻漢字 (𠮷、𡃁 等)**。utf8mb4:真正 UTF-8,最多 4 字節,**全 Unicode 支援**,**生產環境強制使用**。innodb_large_prefix=ON 可擴至 3072 字節。my.cnf 後**必須重啟**服務。ALTER TABLE ... CONVERT TO 會重建表並轉換數據,**大表謹慎操作** (用 pt-online-schema-change)。characterEncoding=utf8mb4,否則驅動默認可能用 utf8 或 latin1。