萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 字符集查詢與設定完整指南:Server/Database/Table/Column 四層級、連線字元集、轉換流程

四層級字符集繼承體系

Server (character_set_server)
    ↓
Database (DEFAULT CHARACTER SET)
    ↓
Table (DEFAULT CHARACTER SET)
    ↓
Column (CHARACTER SET)

**就近原則**:欄位 > 表 > 庫 > Server。修改上層不影響已建立的下層對象。

查看字符集

1. 伺服器支援的字符集

SHOW CHARACTER SET;

2. 當前會話/全域字符集變數

SHOW VARIABLES LIKE '%char%';
SHOW VARIABLES LIKE '%collation%';

關鍵變數:

  • character_set_server:服務端預設。
  • character_set_database:當前庫預設 (由 USE db 決定)。
  • character_set_client:客戶端發送編碼。
  • character_set_connection:連線處理編碼。
  • character_set_results:結果集回傳編碼。
  • collation_connection:連線校對規則。

3. 資料庫/表/欄位字符集

-- 資料庫
SHOW CREATE DATABASE db_name;

-- 表
SHOW CREATE TABLE tbl_name;

-- 欄位
SHOW FULL COLUMNS FROM tbl_name;

設定字符集

1. 伺服器級 (my.cnf,永久,需重啟)

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# init_connect='SET NAMES utf8mb4'  # 非超級用戶自動執行,但有坑

2. 資料庫級

CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3. 表級

CREATE TABLE t (c VARCHAR(100)) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE t DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 僅修改表預設,不影響現有欄位

4. 欄位級 (最精確)

-- 修改欄位字符集並轉換資料 (CONVERT TO)
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 僅修改欄位定義,不轉換現有資料 (風險:資料實際編碼不變)
ALTER TABLE t MODIFY COLUMN c VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

⚠️ **CONVERT TO 會重建表並轉換所有字串欄位資料**,大表極慢且鎖表,建議用 pt-online-schema-change 或 gh-ost 線上變更。

5. 會話級 (連線即時生效)

SET NAMES utf8mb4;  -- 等同於下面三句
SET CHARACTER SET utf8mb4;
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;
SET collation_connection = utf8mb4_unicode_ci;

MySQL 字符集轉換流程 (關鍵內部機制)

  1. 客戶端發送請求:按 character_set_client 編碼。
  2. Server 接收:轉換為 character_set_connection。
  3. 內部操作:按欄位/表/庫/Server 就近確定的**內部操作字符集**執行。
  4. 結果輸出:從內部操作字符集轉換為 character_set_results 回傳客戶端。

**核心結論**:SET NAMES utf8mb4 將 client/connection/results 三者統一,是應用層最關鍵設定。

my.cnf default-character-set 的陷阱

[client] default-character-set **僅影響 mysql/mysqldump 等官方命令列工具**,**不影響** 使用 libmysqlclient / mysqlnd 的應用程式 (PHP、Java、Python 等)。應用層**必須在代碼中顯式設定連線字元集** (DSN charset、SET NAMES、connection properties)。

最佳實踐:全鏈路 utf8mb4

  1. Server:character-set-server=utf8mb4, collation-server=utf8mb4_unicode_ci。
  2. Database/Table/Column:顯式指定 utf8mb4 (或繼承)。
  3. 應用連線:DSN charset=utf8mb4 / SET NAMES utf8mb4。
  4. 驅動:使用 mysqlnd (PHP)、Connector/J 8.0+ (Java)、PyMySQL (Python) 等原生驅動。
  5. 備份/還原:mysqldump --default-character-set=utf8mb4 / mysql --default-character-set=utf8mb4。

總結

字符集問題本質是**編碼不一致導致的轉換錯誤**。建立「Server→DB→Table→Column→Connection→Application」全鏈路 utf8mb4 標準,用 SHOW VARIABLES LIKE '%char%' 和 SHOW CREATE TABLE 定期審計,新建對象強制顯式指定字符集,杜絕隱性繼承帶來的驚喜。

copyright © 萬盛學電腦網 all rights reserved