遭遇 SET character_set_server=utf8 臨時生效但重啟後復原為 gbk 的經典問題,分析根因並提供持久化解決方案。
> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_results | utf8 |
| character_set_server | gbk <-- 伺服器預設仍為 gbk |
+--------------------------+----------------------------+
執行 SET character_set_server=utf8 後暫時正常,但服務重啟失效。
SET GLOBAL / SET 動態修改僅影響當前執行實例的記憶體配置,不寫入配置檔。服務重啟時讀取 my.cnf / my.ini 還原預設值。
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
修改後 必須重啟服務 生效。
在每次資料庫連線建立後立即執行:
$conn->query("SET NAMES utf8");
# 或分別設定
$conn->query("SET character_set_client = utf8");
$conn->query("SET character_set_results = utf8");
$conn->query("SET character_set_connection = utf8");
缺點: 每次連線額外 3 次往返,高併發下影響效能;且無法修正伺服器層級預設 (如新建資料庫預設字元集)。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 或 utf8mb4_general_ci (速度較快、排序準確度稍低)
utf8mb4 支援完整 Unicode (含 Emoji、生僻字)characterEncoding=utf8mb4、PDO charset=utf8mb4ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4;SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
# 確認 client/connection/results/database/server 均為 utf8mb4