【mysql】数据库查询手机号同时加密

有时候我们会遇到这样的需求,根据用户姓名、手机号或者昵称就能查到某个人或者某些人,同时还要对查询到的用户手机号中间几位进行加密处理,比如 131****4529 ,怎么实现呢?

模糊查询

如果是看加密直接看第二步就可以了

首先我们来看通过姓名、手机号或者昵称查到某个人或者某些人

相信很多人都会用很多 likeor 语句进行查询,例如下面这种情况

输入手机号查询用户的头像地址,姓名和手机号,那么我们只需要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()函数一样,但是每个字符串之间要加上xx可以是分隔符
注意
如果我们将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 位,然后中间插入****就可以啦
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Black_Customer/article/details/113172363