| 變數 | 含義 |
| character_set_server | 預設內部操作字元集 |
| character_set_client | 客戶端來源資料字元集 |
| character_set_connection | 連接層字元集 |
| character_set_results | 查詢結果字元集 |
| character_set_database | 當前資料庫預設字元集 |
| character_set_system | 系統元資料字元集 |
字元集轉換流程
- 請求資料:
client → connection
- 內部操作:
connection → 欄位/表/庫/ server 字元集(優先級遞減)
- 結果輸出:
內部字元集 → results
亂碼根因分析(實戰案例)
常見鏈路:欄位無設定 → 表無設定 → 庫無設定 → server 預設 latin1,而連線層為 UTF-8,導致中文寫入時經歷 UTF-8 → latin1 轉換,超出 latin1 範圍的字元變成 ?,資料永久損壞。
常見問題場景
FAQ-1:庫為 UTF-8,插入未設連線字元集,查詢時設 UTF-8
插入經歷 latin1 → latin1 → UTF-8,漢字從 3 字節變 6 字節;查詢 UTF-8 → UTF-8 原樣輸出 6 字節 → 亂碼。
FAQ-2:庫為 latin1,插入前設連線 UTF-8(本文遇到情況)
插入經歷 UTF-8 → UTF-8 → latin1,超出 latin1 範圍字元轉為 ?,資料永久遺失,無法恢復。
檢測工具
SHOW CHARACTER SET;
SHOW COLLATION;
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
SELECT HEX(col), LENGTH(col), CHAR_LENGTH(col) FROM tbl;
SELECT CHARSET(col), COLLATION(col) FROM tbl;
最佳實踐建議
- 建庫/建表/操作時顯式指定字元集,不依賴預設值
- 資料庫與連線字元集統一使用 UTF-8(而非 latin1)
- C API 用
mysql_options(MYSQL_SET_CHARSET_NAME, "utf8")
- PHP 短連線用
SET NAMES utf8,長連線重連後需重設
修改預設字元集方法
修改 my.ini
default-character-set = utf8
character_set_server = utf8
動態指令
SET NAMES 'utf8'; -- 等同於設定 client、connection、results 三者
- 上一篇文章: MySQL SELECT INTO 用法詳解:建表複製、資料匯出與跨表插入
- 下一篇文章: MySQL 字元集知識體系總結:編碼原理、系統變數、轉換流程與實戰排查
Copyright ©
程式碼之家 All Rights Reserved