您可以知道可以在电子邮件地址中使用很多字符。 现在人们在他们的电子邮件地址中分割了一些关键字以提高可读性,例如:
name.surname@gmail.com
x-com.shop.support@stuff.net
但是,使用Gmail(以及大小写)时的点字符.
仅提高了可读性,因此不会将其视为电子邮件地址的一部分。因此,我们可以这样说:
name.surname@gmail.com
与namesurname@gmail.com
x-com.shop.support@stuff.net
与x-comshopsupport@stuff.net
问题
大多数网站都使用数据库驱动的身份验证。假设我注册了一个电子邮件(没有点数)namesurname@gmail.com
然后,这样的MySQL查询将无法正常工作,因为字符串不同:
SELECT * FROM users WHERE email = "name.surname@gmail.com" ;
问题
有没有解决此类问题的解决方法?事实上,不同的电子邮件服务器使用不同的规则。那么,用户必须始终记住,他们使用点或大写字母在哪个网站上,即使该电子邮件地址仍然相同?
的更新 的
想象一下,您可以使用相同的电子邮件制作大量帐户。
原始电子邮件是namesurname@gmail.com
,别名:
name.surname@gmail.com
n.amesur.name@gmail.com
nam.esurname@gmail.com
您仍然会在同一地址收到电子邮件确认。听起来很奇怪,是吗?
答案 0 :(得分:8)
如果真的希望以您的方式解决问题,则必须将您的电子邮件地址存储为某种规范形式。说出所有小写字母,并删除要忽略的“点”或任何其他特殊字符。
您可以使用触发器(http://sqlfiddle.com/#!2/81689/1)“自动化”该事物:
create table email(addr char(80), canon char(80) UNIQUE);
CREATE TRIGGER ins_email BEFORE INSERT ON email
FOR EACH ROW
SET NEW.canon = REPLACE(LOWER(NEW.addr), ".","");
INSERT IGNORE INTO email(addr) VALUES ("Sylvain.Leroux@example.com"),
("sylvainleroux@example.com"),
("SYLVAINLEROUX@ex.ample.com");
这只会根据canonized表单在表格中插入一个行。
请仔细看看最后一个例子。该域名为“ex.ample.com”,我的简单触发器将其标榜为“examplecom”。这可能不是可取的。这只是为了确定正确的标准化可能比REPLACE(LOWER( ...
更复杂一些。此外,您可能需要创建此触发器的重复ON UPDATE
。但...
......我不会朝这个方向走得更远:
“大写[...]未考虑”
这是常见误解:域名(在@右侧)不区分。但local parts(@左侧) 区分大小写。除特殊情况postmaster
。
大多数MTA配置为忽略“本地部分”的区分大小写。但这绝对不是必需的。实际上RFC5321 section 2.2明确指出“邮箱的本地部分必须被视为区分大小写。”