7

ご存じのように、メールアドレスに使用できる文字はたくさんあります。最近では、読みやすさを向上させるために、電子メール アドレスのいくつかのキーワードを分割しています。

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


問題

ほとんどの Web サイトでは、データベース主導の認証が使用されています。メール (ドットなし) を登録したと仮定するとnamesurname@gmail.com、文字列が異なるため、このような MySQL クエリは機能しません。

SELECT * FROM users WHERE email = "name.surname@gmail.com" ;


質問

この種の問題を解決するための回避策はありますか? 実際、異なる電子メール サーバーは異なるルールを使用します。では、ユーザーは、どの Web サイトでドットまたは大文字を使用したかを常に覚えておく必要がありますか? その電子メール アドレスは同じでもかまいませんか?


アップデート

同じ電子メールを使用して大量のアカウントを作成できるサービスを想像してみてください。元のメールアドレスはnamesurname@gmail.com、エイリアス:

name.surname@gmail.com
n.amesur.name@gmail.com
nam.esurname@gmail.com

それでも、同じアドレスに電子メールの確認が届きます。奇妙に聞こえますよね?

4

1 に答える 1

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");

これにより、正規化されたフォームに基づいて、テーブルに1 つの行のみが挿入されます。最後の例をよく見てください。ドメインは「ex.ample.com」で、単純なトリガーによって「examplecom」として正規化されています。これはおそらく望ましくありません。これは、正しい正規化がおそらく より少し複雑になる可能性があることを特定するためのものREPLACE(LOWER( ...です。ON UPDATEさらに、おそらくこのトリガーの複製を作成する必要があります。しかし...


...次のように、その方向にはこれ以上進みません。

「大文字 [..] は考慮されません」

これはよくある誤解です。ドメイン名 (@ の右側)大文字と小文字が区別されません。ただし、ローカル部分(@ の左側) では大文字と小文字が区別されます。特殊な場合を除きpostmasterます。

ほとんどの MTA は、「ローカル部分」の大文字と小文字の区別を無視するように構成されています。しかし、これは絶対に必要ではありません。実際、RFC5321 セクション 2.2は、「メールボックスのローカル部分は大文字と小文字を区別するものとして扱わなければならない」と明確に述べています。

于 2013-08-11T11:25:51.850 に答える