Поиск без учета регистра

Как-то раз проглядел, что у меня в базе данных сравнение строк было регистро-зависимым (cp1251_general_cs). К примеру, при запросе:

SELECT * FROM name_table WHERE name LIKE '%Слово%'

Находились только те записи, в которых буква «С» была большой, а все остальные буквы должны были быть в нижнем регистре.

Чтобы произвести регистро-независимый поиск нужно было делать следующий запрос:

SELECT * FROM name_table WHERE name LIKE '%Слово%' COLLATE cp1251_general_ci

Автор

  • Спасибо огромное! Долго бился в поисках над этим вопросом. Наконец-то поиск работает так как хочется 😀
    Только в примере там одно слово «COLLATE» лишнее

  • vab

    Еще можно прописать кодировку непосредственно на таблице/столбце. Вполне возможно, что это будет более хорошим решением, если идет речь о следование стандартам ANSI в SQL.

  • Skybee,
    Спасибо, поправил.

    vab,
    Получается, что да, такой «фейк» в большинстве случаев свидетельствует о не правильном изначальном проектировании БД.
    Но как экстремальный вариант, возможность полезная 🙂 Можно ведь это применить не только относительно регистра, но и использовать для каких-то «извращенных» операций в таблице, с кодировками, которые не являются для нее «родными» 🙂
    Интересно насколько оператор COLLATE ресурсоёмок.

  • Krot

    Спасибо вот за такие маленькие но очень нужные подсказки!

  • ctepeo

    COLLATE очень ресурсоёмок, потому что ты создашь в темп копию таблицы в другой кодировке, которая после запроса удалится

  • ctepeo

    В таких случаях лучше переводить и поля таблицы, и запрос в один регистр и искать. Примерно так: SELECT * FROM name_table WHERE LOWER(name) LIKE ‘%».mysql_real_escape_string(strtolower(‘Слово’)).»%’

  • Александр Б.

    А не проще применить методику поиска таким макаром?

    SELECT * FROM gr WHERE a LIKE(‘%По%’) OR a LIKE(‘%по%’)

    имея под рукой оператор OR (ИЛИ) мы можем сыграть в двух направлениях

    • А вдруг слово будет с неожиданным регистром типа: «сЛоВо»