**你寫入時用什麼編碼,讀出來就是什麼編碼。** MySQL 4.1+ **不會** 自動轉換你的資料編碼,只會按連線字元集解析、按欄位字元集存儲。
| PHP 檔案編碼 | 寫入 SQL | 讀取 PHP 編碼 | 顯示結果 |
|---|---|---|---|
| GB2312 | INSERT ... '中文' | GB2312 | 正常 |
| UTF-8 | INSERT ... '中文' | UTF-8 | 正常 |
| UTF-8 | INSERT ... (iconv GB2312→UTF-8) | UTF-8 | 正常 (資料庫實為 UTF-8) |
| GB2312 | INSERT ... '中文' | UTF-8 | **亂碼** |
SET NAMES GB2312 (或 SET CHARACTER SET GBK) 強制連線字元集。iconv('UTF-8', 'GB2312', $str) 轉碼顯示。// 統一專案編碼為 UTF-8 (含 PHP 檔案、HTML 頁面、資料庫連線)
// 若必須對接 GB2312 系統:
// 寫入
$sql = "INSERT INTO t(c) VALUES ('" . iconv('UTF-8', 'GB2312//IGNORE', $str) . "')";
// 讀取
$str = iconv('GB2312', 'UTF-8//IGNORE', $row['c']);
//IGNORE 忽略無法轉換字元,避免報錯中斷。CHARSET=utf8mb4 統一存儲,應用層負責轉碼。