首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

解決 PHP 連接 MySQL 亂碼:字元集全鏈路統一指南

     編輯:PHP 相關知識

亂碼根因

資料在 **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 標頭、表單編碼``
`
`

常見錯誤與修正

  1. 使用 `SET NAMES utf8`:`utf8` 別名僅支援 3 位元組字元 (BMP),**無法儲存 Emoji/生僻字**。**必須用 `utf8mb4`**。
  2. PDO DSN 缺少 charset:mysql:host=localhost;dbname=test;charset=utf8mb4。
  3. 資料表已為 utf8mb4 但欄位仍為 utf8:執行 `ALTER TABLE ... CONVERT TO ...` 會遞歸轉換所有字串欄位。
  4. PHP 檔案編碼為 ANSI/GBK:IDE (VS Code/PhpStorm) 右下角切換為 UTF-8 並重新儲存。

驗證腳本

<?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 標頭、表單提交,每一環都要確認。養成遷移專案時執行驗證腳本的習慣,徹底告別亂碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved