Gmail允许“。”和“+”过滤器允许无限数量的电子邮件地址全部指向同一个Gmail帐户。
即。以下所有内容都指向同一个Gmail帐户:
我们的生产环境中有一个表格,其中包含所有注册用户的数据,包括他们的电子邮件地址。
目前,此表格中的gmail电子邮件地址包含上述各种变体。
可能的解决方案:
一个建议的解决方案是创建一个函数......
CREATE FUNCTION STANDARDIZE_EMAIL (
@Email varchar(255)
)
RETURNS varchar(255)
AS
BEGIN
-- we make the email lowercase since email addresses are
-- case independent
SET @Email = LOWER(@Email)
-- if it is a gmail email address then we remove periods and filters from the username
IF RIGHT(RTRIM(@Email), 10) = '@gmail.com'
BEGIN
-- remove domain
SET @Email = REPLACE(@Email, '@gmail.com', '')
--remove periods from username
SET @Email = REPLACE(@Email, '.', '')
-- remove '+' and filter
IF CHARINDEX('+', @Email) > 0
SET @Email = SUBSTRING(@Email, 0, CHARINDEX('+', @Email))
-- add back the domain
SET @Email = @Email + '@gmail.com'
END
RETURN (@Email)
END
使用示例:
SELECT * FROM table
WHERE STANDARDIZE_EMAIL(Email) = STANDARDIZE_EMAIL(@Email)
inb4 :运行流程来标准化当前桌面上的所有电子邮件不是一个选项,因为可能存在重复项,用户将丢失gmail +过滤器功能
另一个建议的解决方案是向表中添加一个GmailEmail字段,并在第一次注册用户时将其gmail电子邮件地址的标准化版本的副本保存到第二个字段,可用于在他们登录时进行比较回来了。
如果可能的话,我不必去达到这个程度。
答案 0 :(得分:2)
正在标准化电子邮件地址 我们搜索的每条记录 db上贵吗?
是。即使这个表占用的页面少于8页,是的,也太贵了。
您是否需要跟踪用户输入的所有无数表格中的电子邮件地址?如果是这样,拥有第二个“干净”专栏也许是丑陋的,但可能是必要的。 (根据您的函数创建计算列的效果与原始解决方案一样差。)
如果您不需要按用户输入(每次)精确维护地址,为什么不:
答案 1 :(得分:1)
我的建议是使用您提供的功能创建一个“标准化”电子邮件字段(以空白开头)。用户登录后,系统可以:
这样做的好处是可以将用户慢慢迁移到新系统,并(透明地)将首选电子邮件用作登录。当然,请注意,在其GMail地址变体下使用多个帐户的用户将无法访问其他帐户;因为你似乎想要阻止它,我将把它称为一个功能。
您可能希望在开头添加一个检查,因此如果标准化字段存在和,则存在非标准化字段(并且它们不匹配),您可以告知用户发生了什么和交易适当的。
答案 2 :(得分:1)
我想指出这些字符! # $ % & ' * + - / = ? ^ _ { | } ``~
在电子邮件地址中都有效。您将为任何实际上没有将“+后缀”和句点映射到同一邮箱的邮箱的系统引入问题。
我认为用户期望将user+spam@example.com和user@example.com视为唯一地址是合理的。
答案 3 :(得分:0)
您可以创建一个computed列来标准化电子邮件。
我知道你说这不是一个选项,但你可能需要再看看标准化列 - 直到你这样做,你的数据库中的数据会有不一致。