json_encode() 失敗(GBK 無法直接 JSON 序列化)SHOW VARIABLES LIKE 'character%';
典型錯誤配置:
character_set_server = gbk -- 核心問題:服務器級默認字符集錯誤
SET character_set_server = utf8mb4;
// PHP mysqli
$mysqli->set_charset("utf8mb4");
// PHP PDO
$pdo = new PDO("mysql:host=...;charset=utf8mb4", $user, $pass);
// Java JDBC
jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useUnicode=true
vim /etc/my.cnf # 或 /etc/mysql/my.cnf
[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' -- 非超級用戶自動執行 skip-character-set-client-handshake -- 強制忽略客戶端字符集聲明
修改後必須重啟:
systemctl restart mysqld
SHOW VARIABLES LIKE 'character_set_server'; -- 應輸出 utf8mb4
mysqldump -u root -p --default-character-set=gbk --single-transaction db_name > backup_gbk.sqlsed -i 's/CHARSET=gbk/CHARSET=utf8mb4/g; s/COLLATE=gbk_[a-z_]*/COLLATE=utf8mb4_unicode_ci/g' backup_gbk.sqlDROP DATABASE db_name;CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;mysql -u root -p db_name < backup_gbk.sql| 特性 | utf8 (utf8mb3) | utf8mb4 |
|---|---|---|
| 最大字節數 | 3 字節 | 4 字節 |
| Emoji 支援 | ❌ 存入報錯或截斷 | ✅ 完整支援 |
| 生僻字支援 | 部分缺失 | 完整 Unicode BMP+補充平面 |
| 索引長度限制 | 767 字節 | 767 字節 (InnoDB 大前綴開啟 3072) |
| 語言/框架 | 配置代碼 |
|---|---|
| Python (PyMySQL) | pymysql.connect(charset='utf8mb4') |
| Go (go-sql-driver/mysql) | dsn = "user:pass@tcp(host:3306)/db?charset=utf8mb4&parseTime=True&loc=Local" |
| Node.js (mysql2) | createConnection({charset: 'utf8mb4'}) |
| C# (MySqlConnector) | connectionString = "Charset=utf8mb4;..." |
客戶端應用 → 連接器驅動 → MySQL 協議 → 服務器 character_set_connection
↓
character_set_client ←→ character_set_results
↓
表/列定義 character_set_database
↓
服務器默認 character_set_server
只有全鏈路統一為 utf8mb4,才能徹底杜絕亂碼與 JSON 序列化失敗。