首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL + PHP 亂碼根因徹底解析:編碼不一致七大來源與分層解決方案

     編輯:MySQL 資料庫相關知識

七大亂碼來源

  1. MySQL 安裝預設編碼(utf8)≠ PHP 頁面編碼。
  2. 建表 DEFAULT CHARSET ≠ 頁面編碼。
  3. 欄位 CHARACTER SET ≠ 頁面編碼。
  4. 表單提交頁編碼 ≠ 顯示頁編碼。
  5. 使用者輸入 Big5,顯示頁 GB2312(跨編碼必亂)。
  6. PHP 頁面 charset 宣告錯誤/遺漏。
  7. 連線指令 SET NAMES 編碼錯誤/遺漏。

版本差異不會導致亂碼,切勿誤判。

編碼選型策略

  • 新專案:全鏈路 utf8mb4(資料庫、表、欄位、連線、HTML、PHP 檔案儲存),支援 Emoji、零轉碼。
  • 舊專案無法改庫編碼:改用 GBK(超集含繁體),兼容 GB2312 並能顯示部分繁體字。

分層修正清單

層級動作指令/設定
資料庫修改預設字符集ALTER DATABASE db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
資料表修改表字符集ALTER TABLE tbl DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
欄位修改欄位字符集ALTER TABLE tbl CHANGE col col VARCHAR(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
PHP 頁面HTTP 標頭宣告header('Content-Type: text/html; charset=utf-8');(需在輸出前)
PHP 頁面檔案儲存編碼編輯器存檔為 UTF-8 without BOM
連線設定連線字符集mysqli_set_charset($link, 'utf8mb4'); 或 SET NAMES utf8mb4(在 SELECT_DB 後)

驗證步驟

  1. 插入測試資料:INSERT INTO t(col) VALUES('測試😀');
  2. 查詢回顯:SELECT col, HEX(col), CHAR_LENGTH(col), CHARACTER_SET_NAME(col) FROM t;
  3. 瀏覽器開發工具 Network → Response Headers 確認 Content-Type: text/html; charset=utf-8。

遺留資料轉碼

已寫入錯誤編碼的資料(如 Big5 存入 GBK 欄位)無法單純改設定修復,需寫腳本逐列 CONVERT(CAST(col AS BINARY) USING big5) USING gbk 或匯出→圖示轉換→重新匯入。

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