字符集不匹配是 MySQL 亂碼的核心成因。本文梳理三種層級的字符集設置方法,對比生效範圍與優先級,給出生產環境標準化配置模板。
| 層級 | 命令/配置 | 生效範圍 | 持久性 | 典型場景 |
|---|---|---|---|---|
| 會話級 | SET NAMES utf8mb4;或分別 SET client/connection/results | 當前連接 | 斷開失效 | 應用代碼連接後首條執行、臨時調試 |
| 全局動態 | SET GLOBAL character_set_server=utf8mb4; | 新建連接 | 重啟失效 | 緊急調整、驗證效果 |
| 配置文件 | my.cnf [client]/[mysqld] 區段 | 所有新連接 | 永久 | 生產環境標準化部署 ✅ |
-- 查看當前所有字符集變量
SHOW 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 | -- 系統標識符編碼(不可改)
+--------------------------+----------------------------+
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
# 服務器級默認
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci -- 或 utf8mb4_0900_ai_ci (8.0 推薦)
# 客戶端連接層(手動連接 mysql 命令行時生效)
# 已在 [client] 設置,此處可不重複
# 可選:強制客戶端使用指定字符集(防止應用未 SET NAMES)
# init_connect = 'SET NAMES utf8mb4' -- 注意:super 權限用戶不觸發
[mysqld] 區段使用 default-character-set=utf8(已廢棄,8.0 會報錯)character-set-server + collation-serverutf8mb4 + utf8mb4_0900_ai_ci,若需兼容舊排序規則可显式指定 utf8mb4_general_ci-- 1. 重啟後新建連接查看
mysql -uroot -p -e "SHOW VARIABLES LIKE 'character_set_%';"
-- 2. 檢查庫/表默認編碼
SHOW CREATE DATABASE db_name;
SHOW CREATE TABLE tbl_name;
-- 3. 實測寫入/讀取
CREATE TABLE t (c VARCHAR(10)) CHARSET=utf8mb4;
INSERT INTO t VALUES ('測試😀');
SELECT c, HEX(c) FROM t; -- 應顯示 F0 9F 98 80 (😀 的 UTF-8 編碼)
| 語言/框架 | 配置要點 |
|---|---|
| JDBC | 連接串 ?useUnicode=true&characterEncoding=utf8mb4 (8.0+ 可省略) |
| PHP mysqli | $mysqli->set_charset('utf8mb4'); 或連接後 SET NAMES utf8mb4 |
| PHP PDO | DSN charset=utf8mb4 (PHP 5.3.6+) |
| Python PyMySQL | charset='utf8mb4' 參數 |
| Go sqlx | DSN charset=utf8mb4 |
| Node.js mysql2 | charset: 'utf8mb4' 選項 |
統一字符集為 utf8mb4,配置文件落地 + 應用層顯式指定,是徹底根治 MySQL 亂碼的唯一正道。