MySQL 字符集配置分為「伺服器持久化配置」、「會話級動態修改」、「C API 程式化設定」三大層面。本文提供 my.cnf 三段式標準配置、SHOW VARIABLES 驗證矩陣、SET 動態指令、C API mysql_options 呼叫範例,並說明預設 latin1 在特定場景下的「免配置相容性」。
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
修改後 systemctl restart mysqld 生效。
SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb4 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
八項核心變數 (除 filesystem) 全為 utf8mb4 即為完全一致。
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_database = utf8mb4;
SET character_set_results = utf8mb4;
SET character_set_server = utf8mb4; -- 需 SUPER 權限,僅影響後續新連線
適用於無法修改配置文件的臨時環境 (如受管雲資料庫)。
MYSQL *mysql = mysql_init(NULL);
mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "utf8mb4");
mysql_real_connect(mysql, "host", "user", "pwd", "db", 3306, NULL, 0);
在 mysql_real_connect 前呼叫,確保連接建立即使用指定字符集。
utf8mb4| 版本 | 預設字符集 | utf8mb4 支援 | 建議 |
|---|---|---|---|
| 5.5 前 | latin1 | 無 | 用 utf8 (僅 BMP) |
| 5.5.3 - 5.6 | latin1 | 有 | 遷移 utf8mb4 |
| 5.7 | latin1 | 有 | 遷移 utf8mb4 |
| 8.0+ | utf8mb4 | 原生預設 | 直接使用 |
字符集配置「持久化 my.cnf 三段式 → 驗證 SHOW VARIABLES → 會話 SET 動態補救 → C API 程式化」四步走,覆蓋部署、運維、開發全場景。將驗證矩陣納入自動化部署腳本,新環境上線自動校驗,徹底告別亂碼。