為什麼修改 MySQL 的 character_set_server
後仍需重啟?從 mysql-connector-net 探討字元集的陷阱
在近期處理一個與 MySQL 字元集相關的問題時,我深入研究了 MySQL Server 的 Handshake 機制以及 mysql-connector-net
原始碼,發現了一個容易被忽略但可能會造成重大錯誤的細節——即使 character_set_server
是動態參數,但實際上修改後仍需要重啟 MySQL Server,否則會造成驅動端的解碼錯誤。
問題背景:為什麼驅動程式仍使用舊的字元集?
根據 MySQL Server 的設計,當 client 端連線時,Server 會在 Handshake Initial Packet 中回傳一些基本資訊,其中就包括伺服器的預設字元集(character_set_server
)。這段資訊是透過以下的程式碼取得:
1 | packet->append_int1(default_charset_info->number); |
根據 MySQL 官方文件,這段資訊會被封裝在 Handshake v10 Protocol 中傳送(官方文件)。
然而,這個值其實是在 MySQL Server 啟動時就被載入的,即使你在執行中動態修改 character_set_server
,重新連線後 greeting packet 裡的字元集值仍然不會更新。