sql中like前缀匹配的正确写法是like 'abc%',%表示任意长度字符(含零),单引号不可省略;'abc'为全等匹配,非前缀匹配;注意大小写敏感性、通配符转义及索引失效风险。

SQL中LIKE前缀匹配的正确写法
直接用 LIKE 'abc%' 就能查出字段以 "abc" 开头的记录,百分号 % 是通配符,表示任意长度(含零长度)的字符。注意单引号必须包裹整个模式,且不能漏掉 %——写成 LIKE 'abc' 是全等匹配,不是“开头匹配”。
常见错误:大小写敏感与数据库差异
MySQL 默认不区分大小写,WHERE name LIKE 'john%' 可能命中 'JohnDoe';而 PostgreSQL 和 SQL Server 默认区分大小写,得写成 ILIKE 'john%'(PostgreSQL)或用 UPPER(name) LIKE UPPER('john%') 保证一致性。SQLite 则取决于字段的 COLLATE 设置,没显式声明时可能行为不一致。
- 生产环境建议统一用函数转换:
WHERE UPPER(column_name) LIKE UPPER('prefix%') - 避免依赖默认排序规则,尤其在跨库迁移或联合查询时
- 如果字段有索引,
UPPER()可能使索引失效——这时应建函数索引(如 PostgreSQL 的CREATE INDEX ON tbl (UPPER(col)))
性能陷阱:前导通配符会让索引失效
LIKE 'abc%' 能走 B-tree 索引(前缀匹配),但 LIKE '%abc' 或 LIKE '%abc%' 无法利用常规索引,会触发全表扫描。当数据量大时,响应明显变慢。
- 确认执行计划:MySQL 用
EXPLAIN SELECT ...,PostgreSQL 用EXPLAIN ANALYZE - 若必须做后缀匹配,考虑生成反向字段(如
name_reversed)并建索引,查询时用WHERE name_reversed LIKE 'cba%' - 全文检索引擎(如 PostgreSQL 的
tsvector、MySQL 的FULLTEXT)更适合模糊/包含类查询,别硬扛在LIKE上
特殊字符转义:下划线和反斜杠要小心
_ 在 LIKE 中是单字符通配符,\ 是默认转义字符(部分数据库需显式指定)。比如想查以 user_2024 开头的记录,直接写 LIKE 'user_2024%' 会错配 userX2024xxx。
- 安全写法(MySQL):
WHERE col LIKE 'user\_2024%' ESCAPE '\' - PostgreSQL 推荐用
ESCAPE ''配合其他字符,例如LIKE 'user#_2024%' ESCAPE '#' - 更稳妥的方式是用正则:
WHERE col ~ '^user_2024'(PostgreSQL)、REGEXP '^user_2024'(MySQL 8.0+),语义清晰且无需手动转义










