在SQL查询中,下划线、百分号、单引号等字符都有特殊含义,如果字段值里本身就包含这些符号,直接写条件会导致结果不对。我们需要用转义字符告诉数据库把特殊符号当作普通文本来处理。

LIKE语句中的通配符转义
在LIKE模糊查询里,百分号%代表任意多个字符,下划线_代表任意一个字符。如果要查包含这两个符号的文本,需要用ESCAPE定义转义符。
MySQL中的写法
使用反斜杠或自定义转义符均可,下面例子查包含"50%"的字符串:
-- 使用自定义转义符 # SELECT product_name FROM products WHERE product_name LIKE '%#%%' ESCAPE '#'; -- 查包含下划线的文本 SELECT product_name FROM products WHERE product_name LIKE '%|_%' ESCAPE '|';
PostgreSQL中的写法
PostgreSQL也支持ESCAPE子句,语法类似:
SELECT email FROM users WHERE email LIKE '%@#_%' ESCAPE '#';
字符串中的单引号转义
SQL字符串用单引号包裹,若内容含单引号,标准写法是写成两个单引号。例如在姓名中查O'Brien:
SELECT * FROM employees WHERE last_name = 'O''Brien';
某些数据库如MySQL可用反斜杠转义单引号,但不如双写单引号通用。
使用参数化查询避免手动转义
在程序代码里拼SQL容易出错且不安全,推荐用参数化查询,由驱动处理特殊符号:
import sqlite3
conn = sqlite3.connect('test.db')
cur = conn.cursor()
# 参数化,无需手动转义特殊符号
cur.execute("SELECT * FROM logs WHERE message LIKE ?", ('%_%', ))
rows = cur.fetchall()
常见特殊符号与转义对照
| 符号 | 默认含义 | 转义方式 |
|---|---|---|
| % | 任意多字符 | LIKE '%#%%' ESCAPE '#' |
| _ | 任意单字符 | LIKE '%|_%' ESCAPE '|' |
| ' | 字符串界定 | 写成两个单引号 '' |
注意:不同数据库对反斜杠的支持不同,写跨库SQL时优先使用ESCAPE子句和双写单引号。
掌握上述转义字符用法,就能准确查询包含特殊符号的文本,不再被通配符干扰。