Поиск по MySQL с игнором регистра через оператор LIKE
Быстрый ответ
Для выполнения поиска по шаблону LIKE
, игнорирующего регистр символов, нужно привести значения в столбце и искомый шаблон к единому регистру. Для этого используются функции LOWER()
(для перевода в нижний регистр) или UPPER()
(для перевода в верхний регистр):
SELECT * FROM таблица WHERE LOWER(столбец) LIKE LOWER('%параметр%');
В SQL Server для подобных запросов применяются коллации, игнорирующие регистр:
SELECT * FROM таблица WHERE столбец COLLATE Latin1_General_CI_AI LIKE '%параметр%';
Повышение гибкости поиска
Функция LOWER()
особенно полезна для реализации поиска, игнорирующего регистр символов. Её сочетание с оператором LIKE
и символом-заменителем %
значительно упрощает решение данной задачи. Вспомогательные функции, такие как LOWER()
или LCASE()
, улучшают поисковые возможности SQL:
-- Шутка для разработчиков SQL: "Ветер перемен" пронизывает этот запрос!
SELECT * FROM деревья WHERE LOWER(название) LIKE LOWER('%ветер%');
Данный запрос обеспечивает нахождение совпадений для 'ВЕТЕР', 'Ветер' и 'ветер' с шаблоном поиска %ветер%
.
Коллация в действии
Для осуществления поиска без учета регистра можно настроить коллацию столбца. Например, коллация UTF8_GENERAL_CI
позволяет производить сравнения, игнорируя различия в регистре:
ALTER TABLE деревья MODIFY COLUMN название VARCHAR(255) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
-- Шутка для разработчиков SQL: В качестве побочного эффекта возможно потребует перестроение индексов.
Суффикс _ci
в названии коллации обозначает игнорирование регистра. После изменения коллации столбца может потребоваться переиндексация.
Изменение чувствительности к регистру для конкретного запроса
Для временного изменения чувствительности к регистру в конкретном запросе можно модифицировать коллацию, при этом сохраняя исходные настройки столбца. Это можно уподобить "временной татуировке" в мире SQL:
SELECT * FROM деревья WHERE название COLLATE utf8_general_ci LIKE '%ветер%';
Визуализация
Представьте себе детектива, который ищет улики, связанные со словом 'КОТ', в базе данных библиотеки. Записи могут содержать 'кот', 'Кот' и 'КОТ'. Чтобы не упустить ни одного совпадения, вы верно используете такой запрос:
SELECT * FROM библиотека WHERE LOWER(название_книги) LIKE LOWER('%кот%');
Этот запрос, подобно фонарю, сканирует полки библиотеки в поисках упоминаний 'КОТ', игнорируя регистр:
Освещённые результаты: [🔦'Кот в шляпе', 🔦'История гусеницы', 🔦'Каталог кошек']
Вопрос производительности
Применение функций LOWER()
или COLLATE
может влиять на производительность, особенно при работе с большими объёмами данных. Создание вычисляемых индексированных столбцов, содержащих значения в нижнем регистре, может стать стратегией увеличения скорости поиска. Бинарные коллации также могут способствовать оптимизации поисковых операций:
CREATE INDEX idx_lower_title ON книги ((LOWER(название)));
-- Шутка для разработчиков SQL: Это непростое "вложение капитала" с лихвой окупится при поиске.
SELECT * FROM книги WHERE LOWER(название) LIKE '%кот%';
Улучшение читаемости кода
Использование подзапросов и псевдонимов поможет вашему коду на SQL оставаться аккуратным и понятным для восприятия на долгосрочной основе:
SELECT book_info.*
FROM (
SELECT LOWER(название) AS low_title, автор, год_издания
FROM книги
) AS book_info
WHERE book_info.low_title LIKE LOWER('%ветер%');
-- Шутка для разработчиков SQL: Псевдоним вступает в игру, и эффективность запроса стремительно растет!
Полезные материалы
- PostgreSQL: Документация: 9.7. Поиск по шаблону
- COLLATE (Transact-SQL) – SQL Server | Microsoft Learn
- Руководство MySQL 8.0: Сравнение строковых функций и операторов
- SQL Server: Функция LOWER()
- Использование SQL-выражений в SQLite
- Синтаксис многоязычных регулярных выражений
- Понимание последовательных номеров журналов в SQL Server для резервного копирования