Server (character_set_server)
↓
Database (DEFAULT CHARACTER SET)
↓
Table (DEFAULT CHARACTER SET)
↓
Column (CHARACTER SET)
**就近原則**:欄位 > 表 > 庫 > Server。修改上層不影響已建立的下層對象。
SHOW CHARACTER SET;
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:連線校對規則。-- 資料庫
SHOW CREATE DATABASE db_name;
-- 表
SHOW CREATE TABLE tbl_name;
-- 欄位
SHOW FULL COLUMNS FROM tbl_name;
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# init_connect='SET NAMES utf8mb4' # 非超級用戶自動執行,但有坑
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE t (c VARCHAR(100)) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE t DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 僅修改表預設,不影響現有欄位
-- 修改欄位字符集並轉換資料 (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 線上變更。
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;
character_set_client 編碼。character_set_connection。character_set_results 回傳客戶端。**核心結論**:SET NAMES utf8mb4 將 client/connection/results 三者統一,是應用層最關鍵設定。
[client] default-character-set **僅影響 mysql/mysqldump 等官方命令列工具**,**不影響** 使用 libmysqlclient / mysqlnd 的應用程式 (PHP、Java、Python 等)。應用層**必須在代碼中顯式設定連線字元集** (DSN charset、SET NAMES、connection properties)。
character-set-server=utf8mb4, collation-server=utf8mb4_unicode_ci。utf8mb4 (或繼承)。charset=utf8mb4 / SET NAMES utf8mb4。mysqlnd (PHP)、Connector/J 8.0+ (Java)、PyMySQL (Python) 等原生驅動。mysqldump --default-character-set=utf8mb4 / mysql --default-character-set=utf8mb4。字符集問題本質是**編碼不一致導致的轉換錯誤**。建立「Server→DB→Table→Column→Connection→Application」全鏈路 utf8mb4 標準,用 SHOW VARIABLES LIKE '%char%' 和 SHOW CREATE TABLE 定期審計,新建對象強制顯式指定字符集,杜絕隱性繼承帶來的驚喜。