代码之家  ›  专栏  ›  技术社区  ›  Aaron Saunders

MySQL中的区分大小写和索引

  •  1
  • Aaron Saunders  · 技术社区  · 15 年前

    我正在创建一个使用电子邮件地址作为唯一标识符的系统。有时我需要按电子邮件地址查找用户。如果用户以小写形式输入电子邮件地址,但数据库将其存储为混合大小写,是完全扫描,还是数据库仍将使用索引?

    这确实是一个问题,因为我试图在将用户添加到系统时验证电子邮件地址是否有效。

    我在数据库的后端使用带有MySQL的Grails。 我当前正在执行此操作以查找用户

    def c = User.createCriteria()
    def currentUser = c.get() { ilike('emailAddress',message.sender.address) }
    

    我知道我可以在UI上强制这个案例,但我也希望在模型级别强制它

    谢谢,很抱歉问了这么长的问题

    3 回复  |  直到 15 年前
        1
  •  0
  •   Daniel Vassallo    15 年前

    对于Grails,您有几个验证模型的选项:

    你可以 write a setter for the emailAddress 将其转换为一致的情况:

    public void setEmailAddress(email){ 
        emailAddress = email
    }
    

    更复杂但正确的答案是 create a custom editor ( PropertySupportEditor )这将自动为您处理规范化。

    您还需要编写自定义 validator 以确保Grails的验证在 emailAddress 未正确规范化。如果您想让它变得非常优雅,可以使用 constraints plugin 这可能导致如下情况:

    static constraints = {
        emailAddress(normalizedEmail:true)
    }
    
        2
  •  2
  •   ChssPly76    15 年前

    指定的MySQL collation 对于每个字符列,可能区分大小写或不区分大小写。

    索引是使用列上指定的任何排序规则生成的,因此:

    1. 更改表以指定电子邮件列上不区分大小写的排序规则(如 ascii-general-ci 例如。
    2. 重建索引。
    3. 享受。

    记住 全部的 针对电子邮件的查询现在将不区分大小写。

        3
  •  1
  •   Daniel Vassallo    15 年前

    不幸的是,MySQL不支持Postgres和Oracle等基于函数的索引。( Source )

    在MySQL中,一个可能的解决方法是为小写的电子邮件地址添加另一列,以及在所有更新和插入时用小写的电子邮件填充该列的触发器。然后简单地索引该列,并将其用于查找。

    使用基于函数的索引,可以执行以下操作:

    CREATE INDEX 
        ix_users
    ON 
        table_users
    USING 
        lower(email_address);