| 字元集 | 特點 | 編碼方式 |
|---|---|---|
| ASCII | 羅馬字母表 | 1 字節,低 7 位,高位 0 |
| LATIN1 | ASCII 擴展 | 1 字節,啟用高位 |
| GB2312 | 簡體中文 | 雙字節 |
| GBK | GB2312 擴展 | 單/雙字節混合,00-7F 兼容 ASCII |
| GB18030 | 國家標準 | 多字節,涵蓋所有中文 |
| Unicode | 國際標準 | UTF-8 (1-4 字節), UTF-16 (2 字節), UTF-32 (4 字節) |
| 變數名 | 含義 |
|---|---|
| character_set_server | 預設內部操作字元集 |
| character_set_client | 客戶端來源資料字元集 |
| character_set_connection | 連接層字元集 |
| character_set_results | 查詢結果字元集 |
| character_set_database | 當前選中資料庫預設字元集 |
| character_set_system | 系統元資料字元集 |
client → connectionconnection → 表欄位字元集(欄位 > 表 > 庫 > server)表欄位字元集 → results無轉換,但實際儲存為 UTF-8 位元組流(6 字節/漢字),讀取反向還原,顯示正常。
Server 將 GBK 位元組流誤判為 UTF-8 解碼,產生錯誤字元。
終端模擬器以 GBK 顯示 UTF-8 位元組流,雙重誤解碼。
-- 查看設定 SHOW VARIABLES LIKE '%character%'; -- 設定連線字元集 SET NAMES utf8; -- 等同設定 client、connection、results -- 修改庫字元集(僅影響後續建表) ALTER DATABASE db_name CHARACTER SET utf8; -- 修改表字元集(僅影響後續新增欄位) ALTER TABLE tbl_name CHARACTER SET utf8; -- 修改表字元集並轉換既有資料 ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8; -- 修改欄位字元集 ALTER TABLE tbl_name MODIFY COLUMN col_name VARCHAR(100) CHARACTER SET utf8; -- 查看欄位實際位元組 SELECT HEX(col_name), LENGTH(col_name) FROM tbl_name;
關鍵點:latin1 表若 client/connection/表統一設為 latin1,寫入 UTF-8 位元組流並不轉碼,讀取時終端以 UTF-8 解碼可正常顯示。但一旦環節不一致即產生亂碼。