資料在 **Client → PHP → MySQL Server → 儲存 → 讀取 → PHP → Client** 流程中,任何一環字元集不一致皆會導致亂碼。核心在於:**全鏈路統一為 UTF-8 (utf8mb4)**。
| 層級 | 檢查項目 | 正確設定 |
|---|---|---|
| 1. 資料庫/資料表 | 預設字元集、排序規則 | CREATE DATABASE db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
| 2. 連線層 | 連線字元集 | PDO: `charset=utf8mb4` in DSN MySQLi: `$mysqli->set_charset('utf8mb4');` 舊 mysql_*: `mysql_set_charset('utf8mb4', $link);` (PHP 5.2.3+) |
| 3. PHP 腳本 | 原始碼檔案編碼、輸出標頭 | 檔案儲存為 **UTF-8 無 BOM** `header('Content-Type: text/html; charset=utf-8');` |
| 4. 前端/瀏覽器 | HTML 標頭、表單編碼 | `` ` |
mysql:host=localhost;dbname=test;charset=utf8mb4。<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass');
$pdo->exec("INSERT INTO t (c) VALUES ('測試😀')");
$row = $pdo->query("SELECT c FROM t")->fetch();
echo $row['c']; // 應正常顯示:測試😀
?>
**全鏈路 utf8mb4** 是解決中文亂碼的唯一標準答案。從建庫、建表、連線、PHP 檔案編碼、HTML 標頭、表單提交,每一環都要確認。養成遷移專案時執行驗證腳本的習慣,徹底告別亂碼。