1

電子メール フィールドを含むデータベースがあり、データベースを循環して、特定の電子メール アドレスに関するすべてのトランザクションを取得します。

電子メールが数個の大文字で保存されている場合に小文字を入力すると、トランザクションが表示されません。他のメールと完全に一致するように変更すると、機能します。

これを変更して、メール フィールドと正しく比較し、大文字と小文字を区別しないようにするにはどうすればよいですか? メールの保存方法を変更する予定はありますか?

$result = mysql_query("SELECT * FROM `example_orders` WHERE `buyer_email`='$useremail';") or die(mysql_error());

お早めにどうぞ!

4

3 に答える 3

4

ええと...メールアドレスは大文字と小文字が区別されることをご存知ですか? RFC 2821から:

動詞と引数の値 (たとえば、RCPT コマンドと拡張名のキーワードの "TO:" または "to:"
) は大文字と小文字を区別しません
が、メールボックスのローカル部分のこの仕様における唯一の例外があります (SMTP
拡張では大文字と小文字を明示的に指定する場合があります)。 -敏感な要素)。つまり、コマンド動詞、メールボックスのローカル部分以外の引数値、および自由形式のテキスト は、その意味に影響を与えることなく、
大文字、小文字、または大文字と小文字の任意の混合でエンコードされる場合があります。
これ
は、メールボックスのローカル部分には当てはまりません。 メールボックスのローカル部分は、
大文字と小文字を区別して扱わなければなりません。
したがって、SMTP 実装
は、メールボックスのローカル パーツの大文字と小文字を区別するように注意する必要があります。メールボックス
ドメインは大文字と小文字を区別しません。特に、一部のホストでは、
ユーザー「smith」がユーザー「Smith」とは異なります。ただし、メールボックスのローカル部分の大文字と小文字の区別を悪用すると、相互運用性
が妨げられるため、お勧めできません。

(強調追加)

于 2012-04-04T21:44:49.780 に答える
3

PHP/MySQL 混合ソリューション:

$result = mysql_query("
    SELECT * 
    FROM example_orders
    WHERE LOWER(buyer_email) = '" . strtolower($useremail) . "';
") or die(mysql_error());

それが行うことは、比較の両側を小文字に変換することです。LOWERを使用すると、MySQL が検索にインデックスを使用できなくなるため、これはあまり効率的ではありません。

より効率的な純粋な SQL ソリューション:

$result = mysql_query("
    SELECT * 
    FROM example_orders
    WHERE buyer_email = '$useremail' COLLATE utf8_general_ci;
") or die(mysql_error());

この場合、比較のために大文字と小文字を区別しない照合の使用を強制しています。そもそも列に大文字と小文字を区別しない照合があった場合、それは必要ありません。

バスティがコメントで提案したように、列の照合順序を変更する方法は次のとおりです。

ALTER TABLE `example_orders` 
CHANGE `buyer_email` `buyer_email` VARCHAR( 100 ) 
   CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL

そうすることを選択した場合は、なしでクエリを実行できますCOLLATE utf8_general_ci

于 2012-04-04T21:41:26.227 に答える
-1

これを行うWHERE buyer_email LIKE '...'と、デフォルトで大文字と小文字を区別しない一致が行われます。

ただし、電子メール フィールドでは、DB に挿入するときに電子メール アドレスを小文字にすることを好みます。

于 2012-04-04T21:36:47.300 に答える