【问题标题】:Case Sensitivity and Indices in MYSQLMYSQL 中的大小写敏感性和索引
【发布时间】:2010-12-29 04:14:36
【问题描述】:

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

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

我在数据库的后端使用带有 MYSQL 的 grails。 我目前正在这样做以找到用户

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

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

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

【问题讨论】:

    标签: mysql hibernate grails


    【解决方案1】:

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

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

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

    请记住,所有对电子邮件的查询现在将不区分大小写。

    【讨论】:

      【解决方案2】:

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

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

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

      CREATE INDEX 
          ix_users
      ON 
          table_users
      USING 
          lower(email_address);
      

      【讨论】:

        【解决方案3】:

        使用 Grails,您有几个选项来验证模型:

        您可以write a setter for the emailAddress 将其转换为一致的大小写:

        public void setEmailAddress(email){ 
            emailAddress = email
        }
        

        更复杂但正确的答案是create a custom editor (PropertySupportEditor),它将自动为您处理标准化。

        您还需要编写自定义validator 以确保如果emailAddress 未正确规范化,Grails 的验证将失败。如果你想让它变得非常优雅,你可以使用 constraints plugin 将验证器变成可重用的约束,这可能会导致如下结果:

        static constraints = {
            emailAddress(normalizedEmail:true)
        }
        

        【讨论】:

          猜你喜欢
          • 2017-02-21
          • 1970-01-01
          • 2019-12-27
          • 1970-01-01
          • 2011-12-26
          • 2013-07-23
          • 1970-01-01
          • 2021-12-21
          • 2018-07-26
          相关资源
          最近更新 更多