首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL LIKE 通配符轉義完整教學:查詢包含 %、_ 的資料

     編輯:MySQL 綜合教學

核心問題:特殊字符如何查詢?

當您需要查詢資料中「真正包含」百分號(%)或底線(_)時,直接使用 LIKE 會被視為通配符,導致結果錯誤。本文詳細說明轉義技巧與多種解決方案。

MySQL 通配符對照表

符號含義轉義後匹配內容
%任意長度字串\% 或 [%] → 字面上的 %
_單一字符\_ 或 [_] → 字面上的 _
[...]字符集合[[] → 字面上的 [
]集合結束] → 字面上的 ](通常不需轉義)

三種轉義方法

方法 1:方括號法(MySQL 專用,最簡潔)

-- 查詢包含 % 的名稱
SELECT * FROM customer WHERE name LIKE '%[%]%';

-- 查詢包含 _ 的名稱
SELECT * FROM customer WHERE name LIKE '%[_]%';

方法 2:ESCAPE 關鍵字(標準 SQL,跨資料庫相容)

-- 指定 \ 為轉義字符
SELECT * FROM customer WHERE name LIKE '%\%%' ESCAPE '\';

-- 指定 / 為轉義字符
SELECT * FROM customer WHERE name LIKE '%/%%' ESCAPE '/';

方法 3:CHARINDEX / LOCATE 函數(不使用 LIKE)

-- SQL Server
SELECT * FROM PersonalMember WHERE CHARINDEX('[', strloginname) > 0;

-- MySQL
SELECT * FROM PersonalMember WHERE LOCATE('[', strloginname) > 0;

實戰範例:查詢包含特殊字符的登入帳號

-- 建立測試資料
CREATE TABLE PersonalMember (
    id INT PRIMARY KEY AUTO_INCREMENT,
    strloginname VARCHAR(50)
);
INSERT INTO PersonalMember (strloginname) VALUES 
('user1'), ('test%user'), ('admin_user'), ('normal');

-- 查詢包含 % 的帳號(三種寫法皆可)
SELECT * FROM PersonalMember WHERE strloginname LIKE '%[%]%';
SELECT * FROM PersonalMember WHERE strloginname LIKE '%\%%' ESCAPE '\';
SELECT * FROM PersonalMember WHERE LOCATE('%', strloginname) > 0;

PHP 程式碼整合注意事項

// 錯誤寫法:變數未轉義,若 $keyword 含 % 會導致錯誤結果
$sql = "SELECT * FROM customer WHERE name LIKE '%$keyword%'";

// 正確寫法 1:使用參數化查詢(推薦)
$stmt = $pdo->prepare("SELECT * FROM customer WHERE name LIKE ?");
$stmt->execute(["%$keyword%"]);

// 正確寫法 2:手動轉義特殊字符
$keyword = str_replace(['%', '_'], ['\%', '\_'], $keyword);
$sql = "SELECT * FROM customer WHERE name LIKE '%$keyword%' ESCAPE '\\'";

常見陷阱與最佳實踐

  • 雙重轉義:PHP 字串與 SQL 字串都需要轉義,'\\%' 在 PHP 中代表 \% 傳給 SQL
  • 效能考量:前導 %(如 %keyword%)無法使用索引,大表建議改用全文搜尋
  • 編碼一致性:確保資料庫、連線、PHP 檔案編碼一致(建議皆用 utf8mb4)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved