前言
初始数据如下:

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
这里还没有评论哦
快来发一条评论抢占前排吧
INSTR