?? 或亂碼Incorrect string value (Error 1366)[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4' # 非 root 連接自動執行
關鍵點:5.5+ 必須用 character-set-server,勿用廢棄的 default-character-set。
-- 查看庫編碼
SHOW CREATE DATABASE db_name;
-- 修改庫預設編碼(僅影響後續新表)
ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改表編碼(轉換現有數據)
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. db.opt(舊版 MySQL 數據庫目錄下的配置文件)
default-character-set=utf8mb4
default-collation=utf8mb4_unicode_ci
SHOW VARIABLES LIKE '%char%';
SHOW VARIABLES LIKE '%colla%';
期望輸出關鍵變數均為 utf8mb4 / utf8mb4_unicode_ci:
# MySQL 5.1/5.5 (Connector/J 5.1)
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&autoReconnect=true
# MySQL 8.0+ (Connector/J 8.0) 默認 UTF-8,通常無需指定
jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai
new String(bytes, "UTF-8") 讀取、str.getBytes("UTF-8") 寫入# -*- coding: utf-8 -*-、連接指定 charset='utf8mb4'mysqli_set_charset($conn, 'utf8mb4') 或 PDO DSN charset=utf8mb4<meta charset="UTF-8">characterEncoding=utf8mb4character_set_client/connection/results 是否 utf8mb4character-set-server=utf8mb4 是否生效| 特性 | utf8 (utf8mb3) | utf8mb4 |
|---|---|---|
| 最大字節數 | 3 字節 | 4 字節 |
| Emoji 支援 | ❌ | ✅ |
| 生僻字支援 | 部分缺失 | 完整 Unicode BMP + 補充平面 |
| 索引長度限制 | 767 字節 | 767 字節 (5.7+) / 3072 字節 (8.0+ innodb_large_prefix) |