Найпоширеніший підхід - це пошук у великому або великому регістрі пошукового рядка та даних. Але з цим є дві проблеми.
- Він працює англійською мовою, але не на всіх мовах. (Можливо, навіть не на більшості мов.) Не кожна маленька літера має відповідну велику літеру; не кожна велика літера має відповідну малу літеру.
- Використання таких функцій, як нижній () та верхній (), дасть вам послідовне сканування. Він не може використовувати індекси. У моїй тестовій системі використання нижче () займає приблизно в 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.