MySQL 的字符集體系並非單一設定,而是由 8 個層級的系統變量與默認值共同構成。理解它們的優先級與作用範圍,是解決亂碼、排序異常、索引失效等問題的關鍵。
character_set_server / collation_server--character-set-server、--collation-server 指定;未指定則為編譯時默認(通常 latin1/latin1_swedish_ci)。CREATE DATABASE 提供默認值。character_set_database / collation_databaseCREATE DATABASE 可顯式指定;否則繼承 server 級值。db.opt;USE db 時讀取並覆蓋會話變量。CREATE TABLE 提供默認值。| 變量 | 作用 |
|---|---|
character_set_client | 決定「如何解讀客戶端發來的 SQL 文本」 |
character_set_connection | 將 SQL 文本從 client 編碼轉為 connection 編碼再執行 |
collation_connection | 用於 SQL 中字面量的比較排序 |
常用 SET NAMES utf8mb4 一次性設定上述三者。
character_set_results查詢結果發送給客戶端前的編碼轉換目標。
CREATE TABLE ... DEFAULT CHARSET=...,為列提供默認值。COLLATION 優先級高於 collation_connection,比較時會先將字面量轉為列字符集。character_set_system固定為 utf8(實際為 utf8mb3),用於數據庫/表/列名稱等標識符存儲,不可變更。
server → database → table → column
↓
connection (client/connection/results)
最佳實踐:全鏈路統一使用 utf8mb4,並在連接建立後立即執行 SET NAMES utf8mb4,避免隱式轉換導致的索引失效或數據截斷。