MySQL 涉及多層字符集:character_set_server(服務端)、character_set_database(資料庫)、character_set_client(客戶端)、character_set_connection、character_set_results。實測發現:**只要寫入與讀取時的客戶端字符集一致,資料庫字符集設定不影響正確性**(僅影響轉換效能與遷移相容性)。
寫入時 MySQL 將
client charset轉為database charset存盤;
讀取時將database charset轉回client charset傳回。
若兩次操作的 client charset 相同,雙向轉換抵消,資料完好無損。
| 連線方式 | 設定位置 | 優先序 |
|---|---|---|
命令列 mysql | my.ini [client] 區段 default-character-set | 高 |
| EMS / Navicat 等 GUI | 工具連線屬性 → 字符集 | 最高(覆蓋 my.ini) |
| JDBC | 連線字串 ?useUnicode=true&characterEncoding=gbk | 最高 |
| PHP (mysqli) | mysqli_set_charset($link, 'gbk') 或連線字串 charset=gbk | 最高 |
| PDO | DSN mysql:host=...;dbname=...;charset=gbk | 最高 |
-- 1. 伺服器/資料庫/客戶端字符集 SHOW VARIABLES LIKE 'character_set_%'; -- 2. 資料表字符集 SHOW TABLE STATUS FROM db_name LIKE 'tbl_name'; -- 3. 欄位字符集 SHOW FULL COLUMNS FROM tbl_name; -- 4. 支援的字符集清單 SHOW CHARACTER SET;
utf8mb4)。DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci,避免隱式繼承造成不一致。utf8mb4,未來遷移至 PostgreSQL、TiDB、OceanBase 等均無字符集障礙。my.ini [mysqld] default-character-set 卻未改應用連線字串 → 依然亂碼。utf8(MySQL 3 字節子集)與 utf8mb4 → 存 Emoji 截斷或報錯。