phpMyAdmin 直接執行 SELECT * FROM class WHERE name='計算機' 有結果,PHP 代碼執行同樣 SQL 無結果。
PHP 源文件編碼與數據庫連接/表字段編碼不一致,導致中文參數在傳輸/比較時亂碼。
// mysqli
$mysqli->set_charset("utf8mb4"); // 或 gbk
// PDO
$pdo = new PDO($dsn, $user, $pass, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"]);
SHOW CREATE TABLE class;
-- 關注 CHARSET=xxx COLLATE=xxx
<meta charset="UTF-8"> // 或 gbk
-- 1. 數據庫/表/列
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE class (name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci);
-- 2. PHP 連接
$mysqli = new mysqli("localhost", "user", "pass", "mydb");
$mysqli->set_charset("utf8mb4");
-- 3. PHP 文件保存為 UTF-8 無 BOM
-- 4. HTML
// 在 PHP 中打印實際發送的 SQL 與十六進制
$sql = "SELECT * FROM class WHERE name='計算機'";
echo bin2hex($sql); // 對比 phpMyAdmin 中複製的 SQL 十六進制