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

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

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

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

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

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

Ответ 1

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. 

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

Ответ 2

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

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%elm%'

Ответ 3

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

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

например.

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

Ответ 4

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

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

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

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

Ответ 5

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

Получение значений в нижнем регистре и 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();

Ответ 6

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

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

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

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

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

Ответ 10

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

    set names `utf8`;
    SET COLLATION_CONNECTION=utf8_general_ci;
    SET CHARACTER_SET_CLIENT=utf8;
    SET CHARACTER_SET_RESULTS=utf8;

Ответ 11

SELECT name 
       FROM gallery 
       WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' 
       GROUP BY name COLLATE utf8_general_ci LIMIT 5