Как я могу искать (без учета регистра) в столбце, используя подстановочный знак LIKE?

170

Я огляделся по сторонам и не нашел, что мне было после этого.

SELECT * FROM trees WHERE trees.`title` LIKE  '%elm%'

Это работает отлично, но не если дерево называется Elm или ELM и т.д.

Как сделать SQL-регистр незаметным для этого поиска в wild-card?

Я использую MySQL 5 и Apache.

  • 0
    MySql 5 на apache?
  • 3
    Если вы наткнулись на эту страницу, но ваши настройки MySql действительно работают с этим запросом для Elm или ELM, и вы хотите, чтобы он учитывал регистр, см. BINARY например здесь: stackoverflow.com/questions/7857669/…
Показать ещё 2 комментария
Теги:
case-insensitive

11 ответов

183
Лучший ответ
SELECT  *
FROM    trees
WHERE   trees.`title` COLLATE UTF8_GENERAL_CI LIKE '%elm%'

Собственно, если вы добавите COLLATE UTF8_GENERAL_CI в определение столбца, вы можете просто опустить все эти трюки: он будет работать автоматически.

ALTER TABLE trees 
 MODIFY COLUMN title VARCHAR(…) CHARACTER 
 SET UTF8 COLLATE UTF8_GENERAL_CI. 

Это также приведет к восстановлению любых индексов в этом столбце, чтобы они могли использоваться для запросов без указания "%"

  • 0
    это тоже работает, это более правильный способ делать вещи? есть вероятность, что это будет локализовано, так что лучше использовать кодировку, чем ниже?
  • 31
    На самом деле, если вы добавите COLLATE UTF8_GENERAL_CI в определение вашего столбца, вы можете просто пропустить все эти приемы: он будет работать автоматически. ALTER TABLE trees MODIFY COLUMN title VARCHAR(…) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI . Это также перестроит все индексы в этом столбце, чтобы их можно было использовать для запросов без начального «%».
Показать ещё 9 комментариев
154

Я всегда решал это, используя lower:

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%elm%'
  • 36
    и испортить индекс использования
  • 2
    Есть ли в MySQL 5 оператор ILIKE?
Показать ещё 11 комментариев
38

Чувствительность к регистру определяется в настройках сортировки столбцов/таблиц/баз данных. Вы можете выполнить запрос под определенной сортировкой следующим образом:

SELECT *
FROM trees
WHERE trees.`title` LIKE '%elm%' COLLATE utf8_general_ci

например.

(Замените utf8_general_ci любой сортировкой, которую вы сочтете полезной). _ci означает нечувствительный к регистру.

  • 1
    В MySQL 5.6 я получаю ОШИБКУ 1273 (HY000): Неизвестное сопоставление: 'utf_general_ci' . Я предполагаю, что это сопоставление было удалено из MySQL? utf8_general_ci работает отлично, хотя.
  • 1
    Была такая же проблема. Вы должны либо исправить свой COLLATE либо сделать простой трюк, подобный этому ( LOWER() обеих ваших строк перед сравнением)
Показать ещё 2 комментария
28

Это пример простого запроса LIKE:

SELECT * FROM <table> WHERE <key> LIKE '%<searchpattern>%'

Теперь без учета регистра с использованием функции LOWER():

SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')
  • 3
    На самом деле это довольно хорошее решение, особенно когда вы сталкиваетесь с проблемами формата COLLATE
  • 0
    Я согласен с Менелаем, это хорошее решение, может быть, лучшее.
13

Я делаю что-то подобное.

Получение значений в нижнем регистре и MySQL делает остальные

    $string = $_GET['string'];
    mysqli_query($con,"SELECT *
                       FROM table_name
                       WHERE LOWER(column_name)
                       LIKE LOWER('%$string%')");

И для альтернативы MySQL PDO:

        $string = $_GET['string'];
        $q = "SELECT *
              FROM table_name
              WHERE LOWER(column_name)
              LIKE LOWER(?);";
        $query = $dbConnection->prepare($q);
        $query->bindValue(1, "%$string%", PDO::PARAM_STR);
        $query->execute();
7

Я думаю, что этот запрос будет делать нечувствительный к регистру поиск:

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';
  • 1
    Я получаю синтаксическую ошибку в MySQL 5.5 при использовании ILIKE в своих запросах
  • 15
    Это работает только для PostgreSQL; не MySQL. postgresql.org/docs/current/static/functions-matching.html
Показать ещё 1 комментарий
0

Вам не нужно ALTER любую таблицу. Просто используйте следующие запросы перед фактическим SELECT запросом, который вы хотите использовать подстановочный знак:

    set names `utf8`;
    SET COLLATION_CONNECTION=utf8_general_ci;
    SET CHARACTER_SET_CLIENT=utf8;
    SET CHARACTER_SET_RESULTS=utf8;
  • 1
    Это очень недооцененный комментарий. Это касается вопроса в целом. Я действительно думаю, что синтаксис alter table также важен, поскольку вопрос может потребовать, чтобы сравнение ограничивалось только этим одним столбцом.
0
SELECT name 
       FROM gallery 
       WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' 
       GROUP BY name COLLATE utf8_general_ci LIMIT 5 
  • 0
    галерея - имя таблицы, имя - столбец в таблице,
  • 2
    пожалуйста, добавьте некоторые примеры вашего кода, показывающие, что он делает и как он помогает - это поможет другим в будущем
0

хорошо в mysql 5.5, как и оператор, нечувствителен... поэтому, если ваша vale является вязами или ELM или Elm или eLM или любым другим, и вы используете как "% elm%", он отобразит все соответствующие значения.

Я не могу сказать о более ранних версиях mysql.

Если вы идете в Oracle, например, работайте с учетом регистра, поэтому, если вы наберете "% elm%", он пойдет только для этого и игнорирует верхние регионы.

Странно, но так оно и есть:)

  • 0
    Это не совсем так. Это работает только в том случае, если для параметра сортировки установлено значение *_ci , что означает «без *_ci регистра». Поскольку это происходит по умолчанию для всех поддерживаемых наборов символов (введите код show character set; чтобы проверить это) - ответ частично верен :-) Только причина неверна. Это не оператор, который нечувствителен к регистру, это сопоставление по умолчанию.
  • 0
    да, я согласен с вами. Это зависит от символа и, тем не менее, если вы работаете с символом * _ci, тогда единственный вариант - использовать двоичный код перед предложением where.
0

Вы должны настроить правильную кодировку и сопоставление для своих таблиц.

Кодирование таблицы должно отражать фактическое кодирование данных. Какова ваша кодировка данных?

Чтобы увидеть кодировку таблицы, вы можете запустить запрос SHOW CREATE TABLE tablename

0

Когда я хочу разрабатывать нечувствительные поисковые запросы, я всегда конвертирую каждую строку в нижний регистр, прежде чем выполнять сравнение

Ещё вопросы

Сообщество Overcoder
Наверх
Меню