MySQL 字元集設定涉及六大關鍵層級,任何一環不一致即可能導致亂碼。本文系統解析各層級職責、查看現狀指令、安裝時預設 UTF-8 步驟、事後修正方案與驗證方法。
| 層級 | 變數名 | 職責說明 |
|---|---|---|
| Client | character_set_client | 客戶端發送 SQL 的編碼(對應網頁 <meta charset="utf-8">) |
| Connection | character_set_connection | 連接層轉換目標編碼,PHP 未指定時依伺服器預設 |
| Database | character_set_database | 資料庫預設編碼,建庫未指定時繼承 Server |
| Results | character_set_results | 伺服器回傳結果集編碼,未指定時依 Server |
| Server | character_set_server | 伺服器安裝時指定的預設編碼(最高層級) |
| System | character_set_system | 系統內部識別碼編碼,通常固定 UTF-8 |
System (utf8) → Server → Database → Table → Column
↘ Connection → Client / Results
utf8,為根基-- 方式 1:STATUS 指令
STATUS;
-- 方式 2:SHOW VARIABLES 精確查詢
SHOW VARIABLES LIKE 'character_set_%';
最徹底解決亂碼的方法是在 MySQL 安裝/初始化時即設定 character_set_server=utf8、collation_server=utf8_general_ci,使六大層級全為 UTF-8,免除後續修正麻煩。
CREATE DATABASE qss
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;
CREATE TABLE t (c VARCHAR(20)) CHARSET=utf8;
ALTER DATABASE qss CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE t MODIFY c VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci;
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$pdo = new PDO($dsn, $user, $pass);
SET NAMES utf8; -- 等同於設定 client/connection/results 三者為 utf8
CONVERT TO 實際轉碼,單純 CHARACTER SET 僅改中繼資料utf8mb4(MySQL 5.5.3+)支援完整 Unicode(含 Emoji),新專案建議直接採用utf8_general_ci 效能較好,utf8_unicode_ci 排序更精準(如德語 ß=ss),視需求選擇SHOW CREATE TABLE 確認欄位實際字元集