首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 字符集配置全攻略:會話級、全局級與 my.cnf 永久生效

     編輯:MySQL 資料庫相關知識

字符集不匹配是 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                       |  -- 系統標識符編碼(不可改)
+--------------------------+----------------------------+

三、推薦配置模板(MySQL 5.5+ / 8.0 通用)

[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 權限用戶不觸發

四、歷史版本差異提示

  • MySQL 5.5 前:[mysqld] 區段使用 default-character-set=utf8(已廢棄,8.0 會報錯)
  • MySQL 5.5 - 5.7:推薦 character-set-server + collation-server
  • MySQL 8.0:默認 utf8mb4 + 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 PDODSN charset=utf8mb4 (PHP 5.3.6+)
Python PyMySQLcharset='utf8mb4' 參數
Go sqlxDSN charset=utf8mb4
Node.js mysql2charset: 'utf8mb4' 選項

統一字符集為 utf8mb4,配置文件落地 + 應用層顯式指定,是徹底根治 MySQL 亂碼的唯一正道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved