Наиболее распространенным подходом является строчная или прописная строка поиска и данных. Но есть две проблемы с этим.
- Работает на английском, но не на всех языках. (Возможно, даже не на большинстве языков.) Не каждая строчная буква имеет соответствующую заглавную букву; не каждая заглавная буква имеет соответствующую строчную букву.
- Использование таких функций, как 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.