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

在这种情况下,我们强制使用不区分大小写的排序规则进行比较。如果该列首先具有不区分大小写的排序规则,则您不需要它。

下面是如何更改列排序规则,正如 Basti 在评论中所建议的那样:

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 '...',默认情况下会进行不区分大小写的匹配。

但是,对于电子邮件字段,我更喜欢在将电子邮件地址插入数据库时​​将其小写。

于 2012-04-04T21:36:47.300 回答