在数据库查询中,除了精确匹配,模糊查询同样占据重要地位。SQLite提供了LIKE操作符来实现模式匹配,它配合两个通配符可以灵活地完成各种模糊搜索需求。本文将从基础语法入手,逐步深入讲解通配符的用法、转义处理以及性能方面的注意事项。

LIKE操作符基础语法与两种通配符
LIKE是SQLite中专门用于模式匹配的操作符,它的语法结构非常简单:列名 LIKE 模式字符串。匹配成功时返回1(真),失败时返回0(假)。与其他数据库不同,SQLite对LIKE的大小写处理有个特殊之处:默认情况下,它只对ASCII字符不区分大小写,也就是说字母a和A可以互相匹配,但中文等其他字符是区分的。
LIKE支持两个通配符,这是它的核心能力所在。第一个是百分号%,代表零个、一个或多个任意字符;第二个是下划线_,代表恰好一个任意字符。理解这两者的区别很重要:'abc%'匹配所有以abc开头的字符串,而'abc_'只匹配以abc开头且后面恰好还有一个字符的字符串,比如abcd可以,abcde就不行。
-- 创建测试表并插入数据
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
email TEXT
);
INSERT INTO users (name, email) VALUES
('张伟', 'zhangwei@ipipp.com'),
('王芳', 'wangfang@ipipp.com'),
('Li Ming', 'liming@ipipp.com'),
('Lily', 'lily@ipipp.com');
-- 查询所有以 L 开头的名字(不区分大小写)
SELECT * FROM users WHERE name LIKE 'L%';
-- 查询第二个字母为 i 的名字
SELECT * FROM users WHERE name LIKE '_i%';
-- 查询邮箱以 .com 结尾的记录
SELECT * FROM users WHERE email LIKE '%.com';上面第三条查询展示了_的典型应用场景:确定某个位置只有一个字符时用它,长度不确定时用%。两者也可以组合使用,比如'%li_e%'表示包含li开头、e结尾且中间恰好一个字符的子串,能匹配到like、life等词。
通配符转义与ESCAPE子句的使用
当要匹配的数据本身包含%或_字符时,问题就来了。比如查询邮箱中包含下划线的用户,直接写LIKE '%_%'是错误的,因为这里的下划线会被解释为通配符,结果会匹配到所有非空字符串。这时候就需要ESCAPE子句来定义转义字符。
ESCAPE的用法是:在模式中用某个字符前缀通配符,使其失去特殊含义变成普通字符。常用的转义字符有反斜杠或加号。需要注意的是,如果使用反斜杠作为转义符,在某些编程语言的字符串中还需要双重转义,容易出现\\%这样的写法,建议在SQL层面保持清晰。
-- 定义反斜杠为转义字符,匹配包含真实下划线的字符串 SELECT * FROM users WHERE email LIKE '%\_%' ESCAPE '\'; -- 匹配包含真实百分号的字符串 SELECT * FROM product WHERE remark LIKE '%\%%' ESCAPE '\'; -- 使用加号作为转义符的写法 SELECT * FROM product WHERE remark LIKE '%+%%' ESCAPE '+';
第一个例子中,\_表示字面意义的下划线,前后的%仍是通配符。如果不写ESCAPE '\',整条语句的含义就完全变了。这是初学者最容易踩的坑之一,尤其是在处理文件名、序列号这类经常包含下划线的数据时。
NOT LIKE、大小写控制与GLOB的对比
除了正向匹配,NOT LIKE可以做反向筛选,比如排除某个域名的邮箱:WHERE email NOT LIKE '%@ipipp.com'。在大小写控制方面,SQLite提供了一个编译选项和PRAGMA case_sensitive_like开关。执行PRAGMA case_sensitive_like = ON;后,LIKE会变成大小写敏感模式,这在需要严格匹配英文标识符时很有用,但要注意该设置是连接级别的,重连后失效。
另一个容易混淆的概念是GLOB操作符。它和LIKE功能类似,但有三个关键区别:一是GLOB区分大小写;二是GLOB使用Unix shell风格的通配符,星号*对应任意多个字符,问号?对应单个字符;三是GLOB支持字符集匹配语法,比如'[a-f]'表示a到f之间的任意一个字符。
-- GLOB 区分大小写:只匹配大写 L 开头 SELECT * FROM users WHERE name GLOB 'L*'; -- GLOB 字符集匹配:名字第三个字符为数字 SELECT * FROM product WHERE code GLOB '??[0-9]*'; -- 大小写敏感开关演示 PRAGMA case_sensitive_like = ON; SELECT 'Hello' LIKE 'h%'; -- 返回 0 PRAGMA case_sensitive_like = OFF; SELECT 'Hello' LIKE 'h%'; -- 返回 1
选择建议很简单:搜索中文内容或需要不区分英文大小写时用LIKE;匹配文件名模式、需要字符集范围判断时用GLOB。另外instr()函数配合> 0判断也可以实现包含匹配,且始终区分大小写,可作为补充手段。
性能影响与索引优化策略
模糊查询最大的隐患在性能。当模式以通配符开头时,比如LIKE '%keyword%',SQLite无法利用普通索引,只能全表扫描,数据量一大查询就会明显变慢。而前缀匹配LIKE 'keyword%'是可以走索引的,因为B-tree索引本身按前缀有序。
针对这个问题有几种应对方案。数据量不大时直接全表扫描其实可接受,SQLite单机场景下百万级数据通常也在毫秒到秒级之间。如果确实需要高频的后缀查询,可以额外建一个反转字符串的列并加索引,查询时用reverse(name) LIKE 'drow%'这类技巧。对于复杂的全文搜索需求,建议启用SQLite的FTS5扩展,它支持分词和倒排索引,效率远高于LIKE。
-- 前缀匹配可以走索引 SELECT * FROM users WHERE name LIKE 'zhang%'; -- 利用表达式索引优化后缀查询 CREATE INDEX idx_email_reverse ON users (reverse(email)); SELECT * FROM users WHERE reverse(email) LIKE 'moc.ppip%'; -- FTS5 全文搜索(需要编译支持) CREATE VIRTUAL TABLE users_fts USING fts5(name, email); SELECT * FROM users_fts WHERE users_fts MATCH 'zhang';
总结一下使用要点:能用前缀匹配就避免双百分号写法;注意_和%的区别,别在下划线数据上翻车;遇到特殊字符记得用ESCAPE转义;中文等非ASCII字符的匹配始终区分大小写,必要时考虑FTS5方案。掌握这些细节后,LIKE就能在各种查询场景中稳定可靠地发挥作用。
SQLite LIKE通配符模糊查询修改时间:2026-09-12 17:34:36