Mysql 将电子邮件地址中的某些字符替换为'*';在SQL查询中

Mysql 将电子邮件地址中的某些字符替换为'*';在SQL查询中,mysql,sql,Mysql,Sql,我正试图在我的网站上实现类似的功能,并希望像下面这样显示电子邮件 下面是我编写的MYSQL代码,它在我测试的场景中正常工作。但我想问问你们,我们是否有更好的解决方案 SELECT CONCAT(RPAD(CONCAT(RPAD(firstletter, firstpartlength - 2, '*'), beforedomain), ( secondpartlength - Length(after

我正试图在我的网站上实现类似的功能,并希望像下面这样显示电子邮件

下面是我编写的MYSQL代码,它在我测试的场景中正常工作。但我想问问你们,我们是否有更好的解决方案

SELECT CONCAT(RPAD(CONCAT(RPAD(firstletter, firstpartlength - 2, '*'),
                   beforedomain), (
                            secondpartlength - Length(afterdot) +
                            firstpartlength ),
                     '*'), afterdot) hiddenemail
FROM   (SELECT SUBSTRING(email, 1, 1)                             firstletter,
               SUBSTRING(email, INSTR(email, '@') - 1, 3)         beforedomain,
               SUBSTR(SUBSTRING(email, INSTR(email, '@')),
               INSTR(SUBSTRING(email,
                     INSTR(email, '@')), '.'))
                      afterdot,
               LENGTH(SUBSTRING(email, 1, INSTR(email, '@') - 1))
               firstpartlength,
               LENGTH(SUBSTRING(email, INSTR(email, '@') + 1))
               secondpartlength
        FROM   test_table) a 
谢谢你的帮助

问候
Kiran

如我在评论中所述,我建议使用基于PHP的解决方案,如下所示:

<?php
$email = 'youremail@ddre.ss';

$beforeAt=explode("@",$email);
$beforeAt=$beforeAt[0];
$asterisks=str_repeat("*",strlen($beforeAt)-2);
$beforeAt=$beforeAt{0}.$asterisks.substr($beforeAt,-1);
$domain=explode("@",$email);
$domain=explode(".",$domain[1]);
$extension=$domain[count($domain)-1];
$domain=implode(".",$domain);
$domain=substr($domain,0,-1*strlen($extension)-1);
$asterisks=str_repeat("*",strlen($domain)-1);
$email=$beforeAt."@".substr($domain,0,1).$asterisks.".".$extension;

echo $email;
?>

无需多个选择,更简单的解决方案:

SELECT
CONCAT(
    SUBSTR(`email`,1,1),
    REPEAT('*',LOCATE('@',`email`)-3),
    SUBSTR(`email`,LOCATE('@',`email`)-1,3),
    REPEAT('*',LENGTH(`email`)-LOCATE('.',REVERSE(`email`))-LOCATE('@',`email`)-1),
    SUBSTR(`email`,LENGTH(`email`)-LOCATE('.',REVERSE(`email`)))
) 
FROM `accounts`;

我不知道您的实际情况,但实施服务器端脚本解决方案可能更好。例如,如果您是从PHP脚本执行此SQL,PHP将是将部分电子邮件更改为星号的更好选择。是的,那是真的。我正在使用PHP。是否有可用于此操作的快速脚本?或者我可以自己写一封邮件……user@server.domain.tld-搜索最后一个点可能更合适。我个人认为这样的格式化应该在代码中完成,而不是在数据库中。谢谢你。这是真的,我不知道为什么在第一次尝试MYSQL查询时。。我将用PHP实现这一点。。请让我知道我们是否已经有任何可用的东西..+1感谢您在查询中所做的努力。谢谢您的快速解决方案。有没有办法让我变得像你一样*******l@d***.ss(@前一个字符,@后一个字符)。现在它将以y*********@****的形式出现。谢谢你,大卫,但是@之后的角色仍然不会出现。但它仍然是以y******************l@***ss的形式出现,而不是以y的形式出现********l@d***.ss。我正在尝试修改您的初始解决方案。。从第2部分获取最后一个字符的子字符串,从第5部分获取第一个字符,但仍在检查..啊,对不起。我没注意到那部分。我再次更新了解决方案。在测试时值得注意的是,如果电子邮件地址很短(例如。ab@u3.am)整个事情都会暴露出来,没有什么会被掩盖。如果你愿意,我可以解决这个问题,但目前短地址不会是私人的。感谢你提供了这个奇妙的解决方案,这工作非常完美。希望没有一家公司有像这样的电子邮件ida@a.a :)