有时候我们会遇到这样的需求,根据用户姓名、手机号或者昵称就能查到某个人或者某些人,同时还要对查询到的用户手机号中间几位进行加密处理,比如 131****4529 ,怎么实现呢?
模糊查询
如果是看加密直接看第二步就可以了
首先我们来看通过姓名、手机号或者昵称查到某个人或者某些人
相信很多人都会用很多 like
加 or
语句进行查询,例如下面这种情况
输入手机号查询用户的头像地址,姓名和手机号,那么我们只需要like和or一直拼下去就可以了
SELECT avatar_path,nick_name,phone FROM xiaoyun_user
WHERE nick_name LIKE '%1568%' OR phone LIKE '%1568%';
下面介绍一种简单的方法:
CONCAT
函数(连接字符串函数)
使用:
CONCAT(str1,str2,…)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
注意:
如果所有参数均为非二进制字符串,则结果为非二进制字符串。
如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。
下面我们用concat()
函数来完成上述需求:
SELECT avatar_path,nick_name,phone FROM xiaoyun_user
WHERE CONCAT(nick_name,phone) LIKE '%1568%'
我们发现,只需要一个like
便可以解决,减少了代码并且看起来美观了很多
附:
但是在spring项目中,我们会用#{}来接收传过来的参数,但是会发现报错,但是用${}替代就不会报错,这里#{}和 ${} 的区别就不在多说。
如果我们用 ${}来代替,那么会引起sql注入问题,所以强烈建议不要用这个。那么我们怎么解决呢?
还是用CONCAT()
函数进行拼接处理,注意这个sql是用在mapper的xml或者是注解中
SELECT avatar_path,nick_name,CONCAT_WS( '****', SUBSTRING(phone,1,3),SUBSTRING(phone, 8, 4) )
FROM xiaoyun_user
WHERE
CONCAT(nick_name,phone) LIKE CONCAT('%',#{selectLike},'%')
我们这里用 CONCAT('%',#{selectLike},'%')
来拼接字符串处理
手机号加密(concat_ws)函数
下面我们来看手机号怎样加密
用到了concat_ws
函数
用法:
CONCAT_WS(x, s1,s2…sn),与CONCAT()函数一样,但是每个字符串之间要加上x
,x
可以是分隔符
注意:
如果我们将x
改为 null,那么查询出来的数据就全为null
现在我们来看如何对手机号加密
SELECT avatar_path,nick_name,
CONCAT_WS( '****', SUBSTRING(phone,1,3),SUBSTRING(phone, 8, 4))
FROM xiaoyun_user
WHERE CONCAT(nick_name,phone) LIKE '%156898%'
我们在查找手机号的时候用 *
在中间进行分隔,SUBSTRING()函数为从字符串 s 的 start 位置截取长度为 length 的子字符串。所以
CONCAT_WS( '****', SUBSTRING(phone,1,3),SUBSTRING(phone, 8, 4))
这句话的意思为截取手机号的前 3 位后 4 位,然后中间插入****
就可以啦