在 Windows DOS 視窗操作 MySQL 時,插入中文資料常遇到 Data too long for column 錯誤,甚至欄位長度明顯足夠卻仍報錯。根源在於 編碼不一致:中文版 Windows 7/10 的 CMD 預設編碼為 GBK,而 MySQL Server 預設採用 UTF-8。客戶端以 GBK 送出,Server 以 UTF-8 解碼,導致位元組長度誤判與亂碼產生。
執行 SHOW VARIABLES LIKE 'character%'; 可見:
character_set_client (客戶端) 顯示 utf8,實際為 GBKcharacter_set_connection (連線) 為 utf8character_set_server (伺服器儲存) 為 utf8character_set_results (結果回傳) 為 utf8實際流向:GBK 編碼送出 → 連線層以 UTF-8 解碼 → 伺服器以 UTF-8 儲存 → 回傳時 UTF-8 轉 GBK 顯示。中間缺少正確的轉碼步驟,亂碼在所難免。
在當前 CMD 視窗執行:
SET NAMES gbk;
此指令同時設定 character_set_client, connection, results 為 GBK,告知 Server「我送的是 GBK,請幫我轉碼存成 UTF-8,查詢時也回傳 GBK」。執行後立即生效,重新插入中文即正常。但開新視窗即失效,治標不治本。
my.ini (通常在 C:\ProgramData\MySQL\MySQL Server x.x\ 或安裝根目錄)。[client] 區段下的 default-character-set=utf8,改為 default-character-set=gbk。net stop mysql && net start mysql)。此後所有 CMD 連線預設皆為 GBK,Server 會自動處理 GBK ⇄ UTF-8 的雙向轉碼 (接收 GBK → 轉 UTF-8 存儲 → 查詢時轉 GBK 回傳),徹底杜絕亂碼。
設定 default-character-set=gbk 後,MySQL 內建轉碼機制會在「連線層」自動將收到的 GBK 位元組轉為 UTF-8 存入引擎,讀取時反向轉換,實現無感相容。