header("Content-Type:text/html;charset=utf-8")utf8mb4_general_ci$pdo->exec('SET NAMES utf8')WHERE name LIKE '%中文%' 無結果PHP 源文件保存編碼 ≠ UTF-8。即使設置了 HTTP 頭和資料庫連接編碼,若 PHP 文件本身以 GBK/ANSI 保存,字符串字面量 '%中文%' 會以 GBK 字節序列發送給 MySQL,導致編碼不匹配,查詢失敗。
File → File Encoding → UTF-8編碼 → 轉為 UTF-8 編碼file -i your.php 應顯示 charset=utf-8$pdo = new PDO(
"mysql:host=localhost;dbname=test;charset=utf8mb4",
$user, $pass,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"
]
);
$search = '%' . $keyword . '%';
$stmt = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$results = $stmt->fetchAll();
| 層級 | 檢查項 | 標準值 | 驗證命令 |
|---|---|---|---|
| PHP 文件 | 保存編碼 | UTF-8 (無 BOM) | 編輯器右下角 / file -i |
| HTTP 響應 | Content-Type | text/html; charset=utf-8 | 瀏覽器 Network 面板 |
| MySQL 服務端 | character_set_server | utf8mb4 | SHOW VARIABLES LIKE 'char%' |
| 數據庫 | DEFAULT CHARSET | utf8mb4 | SHOW CREATE DATABASE db |
| 表 | DEFAULT CHARSET | utf8mb4 | SHOW CREATE TABLE tbl |
| 欄位 | CHARSET | utf8mb4 | SHOW FULL COLUMNS FROM tbl |
| PDO 連接 | DSN charset | utf8mb4 | 代碼檢查 |
| 會話 | NAMES | utf8mb4 | SET NAMES utf8mb4 |
-- MySQL 臨時開啟通用日誌查看實際執行 SQL
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/tmp/mysql_general.log';
-- 執行 PHP 查詢後
SELECT * FROM mysql.general_log WHERE argument LIKE '%中文%';
日誌中若顯示亂碼字節(如 0xE4 0xB8 0xAD 0xE6 0x96 0x87 為 UTF-8「中文」,0xD6 0xD0 0xCE 0xC4 為 GBK),即可確認編碼斷層位置。
utf8mb4 支持 Emoji)charset=utf8mb4SET NAMES utf8(舊版 3 字節),改用 utf8mb4