utf8)≠ PHP 頁面編碼。DEFAULT CHARSET ≠ 頁面編碼。CHARACTER SET ≠ 頁面編碼。charset 宣告錯誤/遺漏。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 後) |
INSERT INTO t(col) VALUES('測試😀');SELECT col, HEX(col), CHAR_LENGTH(col), CHARACTER_SET_NAME(col) FROM t;Content-Type: text/html; charset=utf-8。已寫入錯誤編碼的資料(如 Big5 存入 GBK 欄位)無法單純改設定修復,需寫腳本逐列 CONVERT(CAST(col AS BINARY) USING big5) USING gbk 或匯出→圖示轉換→重新匯入。