LIKE匹配单个结尾字符或字符串最简单写法是column LIKE '%x',其中x为结尾字符;若需多选或复杂模式则用REGEXP 'x$',注意空格和NULL值影响匹配结果。

用 LIKE 匹配单个结尾字符或字符串最简单
直接在 WHERE 条件里写 column LIKE '%x',其中 x 是你要匹配的结尾字符或字符串。注意:不能写成 '%x%'(那是包含),也不能漏掉开头的 %(否则就变成“以 x 开头”了)。
常见错误现象:WHERE name LIKE 'y' 只会匹配字段值**恰好等于 y** 的行,不是“以 y 结尾”;WHERE name LIKE 'y%' 是以 y 开头,方向反了。
-
SELECT * FROM users WHERE email LIKE '%@gmail.com'—— 找所有 Gmail 邮箱 -
SELECT * FROM logs WHERE path LIKE '%.jpg'—— 找所有 JPG 路径 - 如果结尾是特殊字符如
%或_,得用ESCAPE:例如查以_test结尾的:WHERE name LIKE '%\_test' ESCAPE '\'
用 REGEXP 处理多个可选结尾或复杂模式
当要匹配“以 A 结尾 或 以 B 结尾”,或者结尾前有固定结构(比如 B,C 或 B,D),LIKE 写起来就啰嗦且易错,这时 REGEXP 更可靠。MySQL 中 $ 表示行尾锚点,必须加它,否则只是模糊包含。
性能影响:正则比 LIKE 慢,尤其没索引时;但语法清晰、可维护性高。
- 匹配以
B,C或B,D结尾:WHERE path REGEXP 'B,(C|D)$' - 匹配以字母
y结尾:WHERE f_name REGEXP 'y$' - 匹配以
rry结尾(不是单个字符):WHERE f_name REGEXP 'rry$' - 注意大小写:MySQL 默认正则不区分大小写;若需区分,用
REGEXP BINARY
结尾匹配别踩这些坑
最容易忽略的是字段值末尾存在空格或不可见字符(比如换行符 \n、制表符),导致 LIKE '%x' 或 REGEXP 'x$' 失效——因为实际结尾不是 x,而是空格 + x,或者 x + 换行。
- 先用
SELECT HEX(column), LENGTH(column) FROM table LIMIT 1看真实字节内容 - 临时清理:配合
RTRIM()使用,例如WHERE RTRIM(path) LIKE '%.pdf' - 长期方案:入库时就
TRIM字段,或建生成列做标准化处理 -
REGEXP对 NULL 值返回 NULL(即不匹配),而LIKE同样不匹配 NULL——这点一致,但容易误以为“没查到”是逻辑错,其实是数据本身为 NULL
什么时候该放弃结尾匹配?
如果频繁按结尾字段查询,又要求高性能,说明设计可能有问题。结尾匹配几乎无法走索引(除非用函数索引 + 表达式索引,且 MySQL 8.0+ 才支持),全表扫描不可避免。
更可持续的做法是:把结尾特征单独拆成字段存起来,比如从 path = 'A,B,C,D' 提取出 suffix = 'D' 或 last_segment = 'D',然后给这个字段加索引。
临时救急可以,长期依赖结尾匹配查数据,迟早卡在慢查询上。

















