首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

PHP MySQL 中文查詢無結果:編碼一致但 LIKE 模糊查詢失效完整排查

     編輯:程式設計疑難解答

問題現場

  • PHP 設置:header("Content-Type:text/html;charset=utf-8")
  • 數據庫:表/庫/欄位均為 utf8mb4_general_ci
  • PDO 連接:$pdo->exec('SET NAMES utf8')
  • ID 查詢正常,但 WHERE name LIKE '%中文%' 無結果

核心根因

PHP 源文件保存編碼 ≠ UTF-8。即使設置了 HTTP 頭和資料庫連接編碼,若 PHP 文件本身以 GBK/ANSI 保存,字符串字面量 '%中文%' 會以 GBK 字節序列發送給 MySQL,導致編碼不匹配,查詢失敗。

驗證與修復步驟

1. 檢查文件編碼

  • VS Code:右下角編碼顯示,點擊「以編碼保存」選 UTF-8
  • PhpStorm:File → File Encoding → UTF-8
  • Notepad++:編碼 → 轉為 UTF-8 編碼
  • Linux 命令:file -i your.php 應顯示 charset=utf-8

2. 強制 PDO 連接編碼(雙重保障)

$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"
    ]
);

3. SQL 參數綁定(防注入 + 編碼安全)

$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-Typetext/html; charset=utf-8瀏覽器 Network 面板
MySQL 服務端character_set_serverutf8mb4SHOW VARIABLES LIKE 'char%'
數據庫DEFAULT CHARSETutf8mb4SHOW CREATE DATABASE db
表DEFAULT CHARSETutf8mb4SHOW CREATE TABLE tbl
欄位CHARSETutf8mb4SHOW FULL COLUMNS FROM tbl
PDO 連接DSN charsetutf8mb4代碼檢查
會話NAMESutf8mb4SET 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),即可確認編碼斷層位置。

最佳實踐總結

  1. ✅ 統一全鏈路 UTF-8(推薦 utf8mb4 支持 Emoji)
  2. ✅ PHP 文件無 BOM UTF-8 保存
  3. ✅ 使用 PDO 預處理語句綁定參數
  4. ✅ 連接字符串顯式指定 charset=utf8mb4
  5. ✅ 避免 SET NAMES utf8(舊版 3 字節),改用 utf8mb4
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved