MySQL 中文亂碼源於**編碼不一致**。本文提供三大高頻場景的標準化操作流程,從源頭杜絕亂碼,附編碼檢查指令與緊急修復方案。
-- 建庫指定 utf8mb4 (支援 Emoji)
CREATE DATABASE `my_db` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
-- 建表指定 utf8mb4
CREATE TABLE `users` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
**原則**:建庫、建表、欄位三層**統一 utf8mb4**,避免繼承錯誤編碼。
| 資料檔編碼 | 連線設定 | 資料庫/表編碼 | 導入指令 |
|---|---|---|---|
| UTF-8 (無 BOM) | SET NAMES utf8mb4; | utf8mb4 | LOAD DATA LOCAL INFILE 'utf8.txt' INTO TABLE t; |
| GBK/ANSI | SET NAMES gbk; | gbk | LOAD DATA LOCAL INFILE 'gbk.txt' INTO TABLE t; |
鐵律:UTF-8 檔**絕不可**用 GBK 連線導入,反之亦然。DOS 視窗不支援 UTF-8 顯示,導入前用編輯器確認檔案編碼。
my.cnf:character-set-server=utf8mb4、init_connect='SET NAMES utf8mb4'jdbc:mysql://...?useUnicode=true&characterEncoding=utf8mb4 (Java) / charset=utf8mb4 (PDO)<meta charset="UTF-8"> + PHP header('Content-Type: text/html; charset=UTF-8')-- 1. 伺服器級編碼
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
-- 2. 資料庫編碼
SHOW CREATE DATABASE my_db;
-- 3. 資料表編碼
SHOW CREATE TABLE users;
-- 4. 當前連線編碼
SHOW VARIABLES LIKE 'character_set_client';
SHOW VARIABLES LIKE 'character_set_connection';
SHOW VARIABLES LIKE 'character_set_results';
-- 5. 緊急修正連線編碼 (會話級)
SET NAMES utf8mb4;
-- 等同於
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;
瀏覽器亂碼
│
├─ 查看原始碼/Network Header → charset=UTF-8? → 否 → 加 meta/header
│
├─ PHP 讀取變數直接 echo → 亂碼? → 是 → 連線未 SET NAMES / mysqli_set_charset
│
├─ 資料庫客戶端 (Navicat/Workbench) 讀取 → 亂碼? → 是 → 表/欄位 CHARSET 錯誤 → ALTER TABLE ... CHARSET=utf8mb4
│
└─ 以上皆正常 → 檢查 PHP 檔案編碼 (需 UTF-8 無 BOM)
utf8 (MySQL 別名,實為 utf8mb3,**不支援 Emoji**)utf8mb4 (真正 UTF-8,4 bytes,**支援所有 Unicode**)SET NAMES utf8 (隱患)SET NAMES utf8mb4 (標準)