SQLyog 連接 MySQL 後,資料庫、資料表、欄位名稱或資料內容顯示為亂碼(如 `???`、``、亂碼字串),常見於中文環境。
MySQL 連線字元集三要素不一致:
character_set_client:客戶端發送 SQL 的編碼character_set_connection:伺服器解析 SQL 時的編碼character_set_results:伺服器回傳結果的編碼若三者不一致,或與資料表實際儲存編碼(CHARSET)不符,即會產生亂碼。
在 SQLyog 查詢視窗執行:
SET NAMES utf8mb4;
-- 等同於:
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;
> ⚠️ 重新連線後失效,適合臨時測試。
my.cnf / my.ini),在 [mysqld] 區段加入:[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
若資料實際正確但介面顯示亂碼,通常是字型不支援中文:
-- 1. 檢查連線字元集
SHOW VARIABLES LIKE 'character_set_%';
-- 2. 檢查資料庫/資料表/欄位字元集
SHOW CREATE DATABASE db_name;
SHOW CREATE TABLE table_name;
-- 3. 實際寫入/讀取測試
CREATE TABLE t_test (c VARCHAR(20) CHARSET utf8mb4);
INSERT INTO t_test VALUES ('中文測試');
SELECT * FROM t_test;
| 誤區 | 正確觀念 |
|---|---|
| 以為資料壞了 | 多半是「讀取編碼 ≠ 寫入編碼」,資料本身完好,修正連線字元集即可恢復 |
| 使用 utf8 而非 utf8mb4 | MySQL 的 utf8 僅支援 3 位元組(BMP),無法儲存 Emoji、生僻字,**務必用 utf8mb4** |
| 只改資料表 CHARSET | 連線字元集、資料庫預設、資料表預設、欄位 CHARSET 四層皆需一致 |
-- 1. 資料庫層級
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-- 2. 資料表層級(含所有欄位)
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 3. 單一欄位(若不想全表轉換)
ALTER TABLE table_name MODIFY col_name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;