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

MySQL 修改默認字符集兩大方法深度解析:配置文件 vs 會話變量

     編輯:MySQL 資料庫相關知識

核心認知:字符集系統變量層級

MySQL 字符集相關變量分四層,**優先級由高到低**:

  1. Session (會話級):SET NAMES utf8mb4 / SET character_set_client=... 當前連接生效,斷開失效。
  2. Global (全局級):SET GLOBAL character_set_server=utf8mb4 或配置文件,影響**新建連接**,現有連接不變。
  3. Database/Table/Column (對象級):建庫/建表/修改表時指定,存儲層面強制約束。
  4. Default (編譯默認):源碼編譯時決定,極難改動。

方法一:配置文件永久生效 (根治,推薦)

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
skip-character-set-client-handshake = ON  # 強制忽略客戶端指定編碼,統一由服務端決定

驗證:重啟後 SHOW VARIABLES LIKE 'character_set_%'; 所有 *_server/client/connection/results/database/filesystem 均為 utf8mb4 (filesystem 為 binary 正常)。

方法二:會話級 SQL 命令臨時生效 (測試/應急/異構連接)

1. 一鍵三連 (最常用,等價於 SET NAMES)

SET NAMES utf8mb4;
-- 等價於:
SET character_set_client = utf8mb4;
SET character_set_results = utf8mb4;
SET character_set_connection = utf8mb4;

2. 顯式逐項設置 (精細控制)


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 權限,影響全局新連接
SET collation_connection = utf8mb4_0900_ai_ci;
SET collation_database = utf8mb4_0900_ai_ci;
SET collation_server = utf8mb4_0900_ai_ci;

為什麼「庫表設置 utf8mb4 仍亂碼」?

**連接層 (character_set_connection) 不匹配**。

  • 應用發送 UTF-8 編碼 SQL → 連接層按 latin1 解碼 → 存入表 (表為 utf8mb4) → 讀出時連接層按 latin1 編碼返回 → 應用收到亂碼。
  • **必須在發送業務 SQL 前執行 SET NAMES utf8mb4**,或配置驅動連接參數 charset=utf8mb4 (JDBC/Python/Go/PHP/Node 均支援)。

版本差異陷阱

版本[mysqld] 段參數名備註
5.5 及之前default-character-set = utf8僅支援 utf8 (3字節)
5.6 / 5.7character-set-server = utf8mb4推薦 utf8mb4,default-character-set 兼容但不推薦
8.0+character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
default-character-set 在 [mysqld] 已**移除**,使用會報錯 Unknown variable

最佳實踐總結

  1. 基礎設施層:配置文件全鏈路 utf8mb4 + skip-character-set-client-handshake,重啟生效,一勞永逸。
  2. 應用層:連接池/驅動配置 charset=utf8mb4,雙重保險。
  3. 對象層:建庫建表顯式 CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci,不依賴默認值。
  4. 遷移歷史庫:ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; (會鎖表重建,大表用 pt-online-schema-change/gh-ost)。
  5. 驗證:SELECT HEX(col), col FROM t WHERE col LIKE '%中文%'; 確認 HEX 為 UTF-8 編碼字節序列。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved