Z次元
文章 笔记 日志
专题
专栏分类
文章归档
友链
友情链接
朋友圈
留言
头像
系列文章
MySQL模糊查询的多种方式
系列文章
知识积累
更新于:2025/12/4
|
发布于:2025/12/4
文章摘要
MySQL的Like+%通配符模糊查询方式,虽然简单,但是可能存在安全风险和性能问题,可以使用LOCATE、POSITION、INSTR等MySQL函数实现模糊查询的效果

前言

初始数据如下:

like+通配符

说起MySQL模糊查询,那就不得不提like模糊查询了,作为一种简单直接的模糊查询方式,经常出现在大家视野。

总共有两个通配符,%表示匹配任意长度字符,_表示匹配单个字符。

%通配符

通配符可以放在任意位置,用于替换任意个字符:

示例1:前导通配符,查询以ahzoo.cn结尾的数据

SELECT	* 
FROM	demo
WHERE	title LIKE "%ahzoo.cn"

示例2:

查询以ahzoo开头的数据:

SELECT	* 
FROM	demo
WHERE	title LIKE "ahzoo%"

示例3:查询包含ahzoo的全部数据:

SELECT	* 
FROM	demo
WHERE	title LIKE "%ahzoo%"

示例四:任意匹配

SELECT	* 
FROM	demo
WHERE	title LIKE "%ahzoo%笔记%"

_通配符

和%通配符一样,可以放在任意位置,不过一个_通配符只能替换换任意个字符

示例:

SELECT	* 
FROM	demo
WHERE	title LIKE "_hzoo_cn"

用法和%一样,这里不做过多演示

性能问题

like模糊查询实际存在一定的性能问题,可能会导致扫表,所以在使用时应尽量避免使用前导通配符,也就是%keyword 这种查询方式:

SELECT	* FROM	demo WHERE	title LIKE '%keyword'

谨防注入风险

实际上MySQL默认的like模糊查询是存在风险的,如果不对入参加以处理就可能存在注入风险:

SELECT	* FROM	demo WHERE	title LIKE 'keyword%' AND id > 3

此时,如果keyword传入"%test%' or 1=1 --

查询条件就变成了可以查询任意数据

SELECT	* FROM	demo WHERE	title LIKE '"%test%' or 1=1 -- ' AND id > 3

  • MyBatis

对于Mybatis而言,如果使用下面写法就会存在注入风险:

SELECT	* FROM	ahzoo WHERE title LIKE '%${title}%'

可以使用下面更安全的写法替代:

SELECT	* FROM	ahzoo WHERE title LIKE CONCAT('%', #{title}, '%')

LOCATE函数

使用方式:

  • LOCATE('keyword', field) :返回keyword在field字段中首次出现的位置,如果不存在放回0

  • LOCATE('keyword', field, pos) :返回keyword在field字段第pos个位置后首次出现的位置,如果不存在放回0

示例:

SELECT title, LOCATE('ahzoo', title) FROM	demo

SELECT title, LOCATE('ahzoo', title, 3) FROM	demo

利用这一特性,我们就可以实现模糊查询的效果:

SELECT *
FROM	demo
WHERE LOCATE('ahzoo', title) > 0

POSITION

和LOCATE实现模糊查询方式差不多,都是使用查询位置的方式间接判断。

POSITION('keyword' IN field) :返回keyword在field字段中的位置

SELECT *
FROM	demo
WHERE POSITION('ahzoo' in  title) > 0

INSTR

和前面两个函数同理,都是通过位置,间接查询

INSTR(field, 'keyword') : 返回keyword在field字段中的位置

SELECT *
FROM	demo
WHERE INSTR(title,'ahzoo') > 0

版权声明
本文依据 CC-BY-NC-SA 4.0 许可协议授权,请您在转载时注明文章来源为 Z次元 ,若本文涉及转载第三方内容,请您一同注明。
更多专栏文章推荐
知识积累
人非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。
JDK新版特性(22-25)
2025/11/9
SpringBoot集成轻量级搜索引擎——Meilisearch
2025/8/7
评论区

删除确认

评论删除后无法恢复,请确认是否继续?
发表评论

这里还没有评论哦

快来发一条评论抢占前排吧

目录
前言
like+通配符
%通配符
_通配符
性能问题
谨防注入风险
LOCATE函数
POSITION
INSTR
目录
前言
like+通配符
%通配符
_通配符
性能问题
谨防注入风险
LOCATE函数
POSITION
INSTR
博客
文章 笔记 日志
专题
专栏分类 文章归档
友链
友情链接 朋友圈
交流
留言 关于我
主页
菜单
置顶
主题
我的
十玖八柒
每天进步多一点
欢迎到访φ(゜▽゜*)♪
最新评论
个人占星:
DeepSeek没有想象中的好用
个人占星:
想给自己的网站弄个统计功能,但不会弄,头疼
永恒末匕:
好哇塞,这个厉害
Corwin: @十玖八柒
哎 主要是我的个人网站用的是静态的cos 实现评论框还是有点困难
我的
关于我
个人主页
站点地图
RSS订阅
导航
十年之约
虫洞穿梭
开源博客
前端开源仓库
后端开源仓库
©2020 - 2025 By 十玖八柒 版权所有
豫ICP备20021466号