使用PHP将MySQL字段强制为小写

时间:2012-04-04 21:34:37

标签: php mysql uppercase lowercase

我有一个带有电子邮件字段的数据库,它循环访问数据库以获取有关某个电子邮件地址的所有交易。

当用多个大写字母存储电子邮件时,用户输入小写字母会导致其无法显示其交易。当我修改它以匹配其他电子邮件的完美案例时,它可以工作。

如何修改它以便正确地与电子邮件字段进行比较,并且大小写无关紧要?是否会改变电子邮件的存储方式?

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

提前致谢!

3 个答案:

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

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