导读:本期聚焦于关中王创作的《SQLite LIKE模糊匹配怎么用?通配符%和_的详细用法解析》,敬请观看详情。在做数据查询时,精确匹配往往满足不了业务需求,比如搜索商品名称包含某个关键字的所有记录,这时候就需要模糊查询。SQLite提供了LIKE操作符配合通配符来完成这类匹配,其中百分号表示任意长度字符串,下划线表示单个字符。本文围绕LIKE的基本语法展开,详细讲解两种通配符的搭配技巧、ESCAPE转义特殊字符的方法,以及LIKE与GLOB的区别。还会介绍如何利用大小写不敏感的特性优化搜索体验,并通过实际案例演示多条件组合查询的写法,帮助你彻底掌握SQLite中的模糊匹配技术。

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

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

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260912/55452.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。