在MySQL里,Like是一个用于进行字符串模糊匹配的比较操作符。当我们不能确定字段的完整值,只想找出包含某些字符、或以某段字符开头结尾的记录时,就等于号无法胜任,必须用Like配合通配符来描述匹配规则。它最常见的使用场景就是搜索框、日志关键字过滤、用户名片段查询等。

Like的基本语法与通配符
Like操作符一般写在Where条件中,基本形式是字段名 Like '匹配模式'。它依赖两个核心通配符:百分号%代表任意长度(包括零长度)的任意字符,下划线_代表恰好一个任意字符。例如name Like '张%'表示姓张的所有人,name Like '张_'表示姓张且名字只有两个字的人。
除了这两个通配符,还可以用Not Like取反,找出不匹配模式的记录。如果字段里本身就包含百分号或下划线,需要用转义符声明,比如Like '50%%' ESCAPE ''表示以“50%”开头的字符串。掌握这些基础规则,才能避免写出误匹配或查不到数据的SQL。
-- 查找用户名中包含 admin 的所有记录 SELECT id, username FROM user WHERE username LIKE '%admin%'; -- 查找手机号前三位为 138 的记录 SELECT id, phone FROM user WHERE phone LIKE '138%'; -- 查找姓名恰好为两个汉字且姓李的记录 SELECT id, name FROM user WHERE name LIKE '李_';
Like与等于号查询的区别
等于号(=)做的是精确匹配,要求字段值和给定值完全一致,包括长度和字符顺序。而Like做的是模式匹配,只要字段内容符合你写的模糊规则就返回。比如字段值是“张三丰”,用= '张'查不到,但用Like '张%'就能查到。二者语义差异决定了使用场合:精确查找用等于,片段搜索用Like。
在性能层面,等于号在字段有索引时通常能快速定位;Like如果以%开头(如'%abc')则无法有效利用B+树索引,只能全表扫描。只有前缀匹配(如'abc%')才可能用到索引。因此实际开发中,不应滥用Like做所有查询,而应根据业务需要选择操作符,并对高频模糊字段考虑全文索引等方案。
| 对比项 | 等于号(=) | Like |
|---|---|---|
| 匹配方式 | 精确匹配完整值 | 按通配符模糊匹配 |
| 常见用途 | 主键查询、状态判断 | 搜索、关键字过滤 |
| 索引利用 | 易命中索引 | 仅前缀匹配易命中 |
使用Like的注意事项
第一个常见误区是认为Like一定慢。其实如果是'abc%'这种前缀模糊,且字段有普通索引,MySQL依然可以范围扫描,速度并不差。真正导致慢查询的是前后都带%的写法,此时只能逐行比对。若系统对这类需求性能敏感,可改用全文索引(FULLTEXT)或外部搜索引擎。
第二个注意点是字符集和排序规则会影响匹配行为。例如使用utf8_general_ci时,Like不区分大小写;换成utf8_bin就区分。因此在跨平台或多人协作项目里,要确认库的排序规则,避免“明明数据有却查不出”的问题。下面示例展示如何指定区分大小写的查询:
-- 使用二进制排序规则强制区分大小写 SELECT id, code FROM product WHERE code LIKE 'AB%' COLLATE utf8_bin;
实践中的典型用法
在后台管理系统中,搜索订单号片段、用户昵称关键字是Like的高频用法。推荐把用户输入做转义后再拼接,防止通配符注入。例如用户搜“%”本身,若直接拼进Like会导致匹配全部,应转义为%。如下面PHP片段演示了简单转义逻辑:
$keyword = $_GET['q'];
// 将用户输入中的 % 和 _ 转义,避免通配符滥用
$escaped = strtr($keyword, array('%' => '%', '_' => '_'));
$sql = "SELECT * FROM article WHERE title LIKE '%" . $escaped . "%' ESCAPE '\'";
另一个实践是结合Concat函数实现多字段联合模糊搜。比如同时搜标题或内容包含词项的文章,可以用Where Concat(title, content) Like '%词%',不过这种写法通常无法用索引,仅适合小表或低频操作。数据量大时应分别为字段建全文索引,或用搜索引擎分担。