2009-12-22 2 views
1

Я создаю систему, в которой используется адрес электронной почты как уникальный идентификатор. Мне нужно искать пользователя по адресу электронной почты. Если пользователь вводит адрес электронной почты во всех строчных строках, но база данных хранится в виде смешанного случая, это полное сканирование или база данных все еще использует индекс?Чувствительность и индексы в MYSQL

Это действительно проблема, потому что я пытаюсь проверить, что адрес электронной почты действителен при добавлении пользователя в систему.

Я использую grails с MYSQL на задней стороне базы данных. Я сейчас делаю это, чтобы найти пользователя

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

Я знаю, что могу заставить случай в UI, но я хотел бы, чтобы заставить его на уровне модели

Спасибо, и извините за long question

ответ

0

С 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) 
} 
1

К сожалению, MySQL не поддерживает функциональные индексы, такие как Postgres и Oracle. (Source)

Возможным обходным решением в MySQL является добавление другого столбца для нижних регистров электронной почты и триггер, который заполняет его строчными электронными письмами для всех обновлений и вставок. Затем просто проиндексируйте этот столбец и используйте его для поиска.

С индексом на основе функции, вы смогли бы сделать следующее:

CREATE INDEX 
    ix_users 
ON 
    table_users 
USING 
    lower(email_address); 
2

MySQL определяет collation для каждого столбца символов, которые могут быть чувствительны к регистру или нечувствительным к регистру.

индекса построен с использованием любых параметров сортировки указан на колонке, так:

  1. Alter таблицы, чтобы указать регистронезависимые параметры сортировки по колонку электронной почты (например, ascii-general-ci, например).
  2. Восстановите свой индекс.
  3. Наслаждайтесь.

Имейте в виду, что все запросы к электронной почте теперь будут чувствительны к регистру.

Смежные вопросы