我有一个带有电子邮件字段的数据库,它循环访问数据库以获取有关某个电子邮件地址的所有交易。
当用多个大写字母存储电子邮件时,用户输入小写字母会导致其无法显示其交易。当我修改它以匹配其他电子邮件的完美案例时,它可以工作。
如何修改它以便正确地与电子邮件字段进行比较,并且大小写无关紧要?是否会改变电子邮件的存储方式?
$result = mysql_query("SELECT * FROM `example_orders` WHERE `buyer_email`='$useremail';") or die(mysql_error());
提前致谢!
答案 0 :(得分:4)
呃......你意识到电子邮件地址属于敏感,对吗?来自RFC 2821:
动词和参数值(例如,RCPT命令中的“TO:”或“to:” 和扩展名称关键字)不区分大小写,唯一的 邮箱本地部分的此规范中的例外(SMTP
扩展可以明确指定区分大小写的元素)。那是, 命令动词,邮箱local-part以外的参数值,
自由格式文本可以大写,小写或任何形式编码 大小写混合,不影响其含义。这
不适用于邮箱本地部分。 邮箱的本地部分
必须被视为区分大小写。因此,SMTP实现
必须注意保留邮箱本地部分的大小写。邮箱
域不区分大小写。特别是对于一些主持人来说 用户“smith”与用户“Smith”不同。但是,剥削 邮箱本地部分的区分大小写阻碍了互操作性 并且气馁。
(强调补充)
答案 1 :(得分: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
的情况下运行查询。
答案 2 :(得分:-1)
如果您执行WHERE buyer_email LIKE '...'
,则默认情况下会执行不区分大小写的匹配。
但是,对于电子邮件字段,我更喜欢在将其插入数据库时小写电子邮件地址。