LIKE 转义是什么
LIKE 里 % 与 _ 是通配符,要搜索字面量的百分号、下划线或转义符本身就必须转义。标准做法是用 ESCAPE 子句显式指定一个转义符,例如 LIKE '100!%' ESCAPE '!'。MySQL 默认把反斜杠当作 LIKE 的转义符,可以省略 ESCAPE,但反斜杠在很多编程语言与字符串字面量里本身也需要转义,叠加后容易出错;PostgreSQL 与标准一致,没有默认转义符,必须显式写 ESCAPE。要匹配转义符本身时把它连写两次。
基本信息
| 通配符 | % 匹配任意长度,_ 匹配恰好一个字符 |
|---|---|
| MySQL 默认 | 反斜杠为默认转义符,可省略 ESCAPE |
| PostgreSQL 默认 | 没有默认转义符,必须显式写 ESCAPE |
| 显式写法 | LIKE '100!%' ESCAPE '!' |
| 匹配转义符本身 | 连写两次,例如 ESCAPE '!' 下写 '!!' |
| 大小写 | 取决于排序规则:MySQL 默认不区分,PostgreSQL 区分 |
典型使用场景
- 搜索含百分号的内容:折扣率、完成度这类带 % 的文本
- 搜索含下划线的编码:SKU、变量名、文件名
- 清洗含反斜杠的数据:Windows 路径与转义文本
- 参数化查询里拼 LIKE:用户输入的通配符必须转义
- 跨库迁移 SQL:MySQL 省略 ESCAPE 的写法搬到 PostgreSQL 会失效
- 导入校验:过滤掉异常字符组成的记录
示例
示例
-- 搜索字面量百分号
SELECT * FROM rates WHERE label LIKE '100!%' ESCAPE '!';
-- 搜索字面量下划线
SELECT * FROM codes WHERE code LIKE 'A!_1' ESCAPE '!';
-- 搜索字面量感叹号本身:写两次
SELECT * FROM notes WHERE body LIKE '%!!%' ESCAPE '!';
-- MySQL 依赖默认反斜杠(不建议跨库复用)
SELECT * FROM rates WHERE label LIKE '100\%';
-- PostgreSQL 同样写法需要显式声明
SELECT * FROM rates WHERE label LIKE '100!%' ESCAPE '!';转义行为对照
| 场景 | MySQL | PostgreSQL |
|---|---|---|
| 默认转义符 | 反斜杠 | 无,需 ESCAPE 指定 |
| 匹配 % | LIKE '100\%' | LIKE '100!%' ESCAPE '!' |
| 匹配 _ | LIKE 'A\_1' | LIKE 'A!_1' ESCAPE '!' |
| 匹配转义符本身 | '\\' | '!!'(以 ! 为例) |
| 大小写敏感 | 默认不敏感 | 默认敏感 |
应用层拼 LIKE 时不要直接把用户输入塞进去:先转义输入里的 %、_ 与转义符,再套上自己的通配符,避免用户输入被当成模式。
ESCAPE 的字符选择要避开数据里常见字符:选 ! 或 # 比较容易,选反斜杠要留意多层转义。
依赖 MySQL 默认反斜杠转义的 SQL 迁移到 PostgreSQL 后会静默改变匹配范围,迁移前统一改成显式 ESCAPE 写法。
使用要点
- 显式写 ESCAPE,跨库与跨版本的写法保持一致
- 转义符选数据里少见的字符,减少二次转义
- 使用参数化查询,转义在应用层完成,SQL 里只留占位符
- 匹配转义符本身要连写两次,写完用样例数据验证
- 注意大小写敏感差异,PostgreSQL 需要 ILIKE 或调整排序规则
- 模糊匹配结果用于展示时限制条数,避免一次返回大量数据