Наиболее распространенным подходом является строчная или прописная строка поиска и данные. Но есть две проблемы с этим.
- Работает на английском, но не на всех языках. (Может даже не в
большинство языков.) Не каждая строчная буква имеет соответствующий
Прописная буква; не каждая заглавная буква имеет соответствующий
строчная буква.
- Использование таких функций, как lower () и upper (), даст вам последовательный
сканирования. Он не может использовать индексы. В моей тестовой системе использование lower () занимает
примерно в 2000 раз дольше, чем запрос, который может использовать индекс. (Тестовые данные имеют чуть более 100 тыс. Строк.)
Существует как минимум три менее часто используемых решения, которые могут быть более эффективными.
- Используйте модуль citext , который в основном имитирует поведение нечувствительного к регистру типа данных. Загрузив этот модуль, вы можете создать регистр без учета регистра
CREATE INDEX ON groups (name::citext);
. (Но см. Ниже.)
- Используйте сортировку без учета регистра. Это устанавливается при инициализации
база данных. Использование сортировки без учета регистра означает, что вы можете принять
практически любой формат из кода клиента, и вы все равно вернетесь
полезные результаты. (Это также означает, что вы не можете выполнять запросы с учетом регистра. Дух.)
- Создать функциональный индекс. Создайте строчный индекс, используя
CREATE
INDEX ON groups (LOWER(name));
. Сделав это, вы можете воспользоваться
индекса с запросами типа SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
или SELECT id FROM groups WHERE LOWER(name) = 'administrator';
Вы должны запомнить , чтобы использовать LOWER (), хотя.
Модуль citext не предоставляет тип данных без учета регистра. Вместо этого он ведет себя так, как если бы каждая строка была в нижнем регистре. То есть он ведет себя так, как если бы вы вызывали lower()
для каждой строки, как в номере 3 выше. Преимущество заключается в том, что программистам не нужно запоминать строчные буквы. Но вам нужно прочитать разделы «Поведение сравнения строк» и «Ограничения» в документах, прежде чем вы решите использовать citext.