插入中文顯示為「???」或亂碼,SHOW VARIABLES LIKE '%char%' 顯示 character_set_client/connection/results = latin1/gbk,與數據不匹配。
MySQL 字符集流向:
客戶端編碼 (client)
→ 連接層轉換 (connection)
→ 服務端內部處理 (server/database/table/column)
→ 結果集編碼 (results)
任一環節不一致,即產生亂碼。
my.cnf(或 my.ini)
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4' -- 針對非超級用戶自動執行
關鍵點:
utf8(僅 3 字節)。[client] 影響 mysql、mysqldump 等客戶端工具。[mysqld] 決定服務端默認字符集與排序規則。SET NAMES utf8mb4; -- 等同於設定 client/connection/results 三者
-- 或
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;
SHOW VARIABLES LIKE '%char%';
-- 期望輸出:
-- character_set_client | utf8mb4
-- character_set_connection | utf8mb4
-- character_set_database | utf8mb4
-- character_set_results | utf8mb4
-- character_set_server | utf8mb4
-- character_set_system | utf8mb4
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
useUnicode=true + characterEncoding=utf8mb4 必須同時設置。CHARSET=utf8mb4。ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 重建表轉碼。my.ini 路徑易混淆 → 用 mysqld --help --verbose | findstr my.ini 確認讀取順序。一次配置正確,永別亂碼煩惱。