首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 編碼亂碼終極解決方案:實戰經驗總結、PHP 存取最佳實踐、phpMyAdmin 避坑指南

     編輯:MySQL 綜合教學

前言

MySQL 編碼問題是開發者的永恆痛點。本文基於大量實戰經驗,揭示編碼亂碼的核心邏輯:「你用什麼編碼寫入,就得用什麼編碼讀出」。無需複雜理論,掌握這一核心原則配合實操技巧,徹底解決亂碼。

核心鐵律

寫入端編碼 = 讀取端編碼 = 前端頁面編碼,三者一致即無亂碼。MySQL 內部儲存的是位元組流,不會主動轉碼。

實戰場景驗證

場景 1:全站 GB2312 (舊專案)

  • PHP 檔案編碼:GB2312
  • INSERT SQL:GB2312 位元組寫入
  • SELECT 讀出:GB2312 位元組 → GB2312 頁面顯示 ✅ 正常

場景 2:全站 UTF-8 (現代標準)

  • PHP 檔案編碼:UTF-8
  • INSERT SQL:UTF-8 位元組寫入
  • SELECT 讀出:UTF-8 位元組 → UTF-8 頁面顯示 ✅ 正常

場景 3:寫入 GB2312,顯示 UTF-8 (跨編碼需求)

必須在 PHP 層轉碼:

// 寫入前:UTF-8 → GB2312
$gbk_str = iconv('UTF-8', 'GB2312//IGNORE', $utf8_str);
mysql_query("INSERT INTO t (c) VALUES ('$gbk_str')");

// 讀取後:GB2312 → UTF-8
$utf8_str = iconv('GB2312', 'UTF-8//IGNORE', $row['c']);
// 或 mb_convert_encoding($row['c'], 'UTF-8', 'GB2312')

phpMyAdmin 亂碼真相

phpMyAdmin 內部檔案為 UTF-8 編碼,因此:

  • 匯入 SQL:按 UTF-8 解讀 → 寫入 UTF-8 位元組
  • 你用 GB2312 PHP 讀取 → 當然亂碼

三種解決方案

  1. 讀取時 SET NAMES:SET NAMES 'gb2312' (不確定有效)
  2. PHP 層 iconv 轉碼:讀出後 iconv('UTF-8', 'GB2312', $str)
  3. 棄用 phpMyAdmin 匯入:自己寫 GB2312 PHP 匯入腳本 ✅ 最可靠

MySQL 設定檔建議 (my.cnf)

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'

重點:MySQL 5.5+ 請用 utf8mb4 而非 utf8 (後者僅支援 3 字節,無法存 Emoji)。

PHP 連線最佳實踐

$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'user', 'pass', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
]);

// 或 mysqli
$mysqli->set_charset('utf8mb4');  // 關鍵!等同 SET NAMES utf8mb4

常見誤區澄清

誤區真相
修改資料表 CHARSET 就能修好亂碼錯!資料已寫入,ALTER TABLE 只影響新資料,舊資料位元組不變
MySQL 會自動轉碼錯!MySQL 只比對 connection charset 與 column charset,不匹配才轉碼
utf8 就夠了utf8mb4 才是真正的 UTF-8,支援 4 字節字符 (Emoji、生僻字)

總結

MySQL 編碼亂碼本質是編碼不一致。解決三步曲:1. 統一前端/PHP/連線編碼為 utf8mb4、2. 連線建立即執行 SET NAMES utf8mb4、3. 歷史資料用 iconv 遷移。拒絕在 MySQL 層設定花招,源頭統一才是王道。

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