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

Я огляделся и не нашел то, что мне было нужно, вот и все.

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

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

Как сделать SQL нечувствительным к регистру для этого поиска по шаблону?

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

Ответы [ 13 ]

245 голосов
/ 20 мая 2010
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. 

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

213 голосов
/ 20 мая 2010

Я всегда решал это с помощью более низкого:

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%elm%'
44 голосов
/ 20 мая 2010

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

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

например.

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

36 голосов
/ 20 июля 2014

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

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

Теперь без учета регистра с помощью LOWER () func:

SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')
18 голосов
/ 09 января 2018

Просто используйте:

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

Или используйте

"SELECT * FROM `trees` WHERE LCASE(trees.`title`) LIKE  '%elm%'";

Обе функции работают одинаково

14 голосов
/ 01 июня 2015

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

Получение значений в нижнем регистре, а 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 голосов
/ 13 августа 2013

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

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';
1 голос
/ 22 июня 2017

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

    set names `utf8`;
    SET COLLATION_CONNECTION=utf8_general_ci;
    SET CHARACTER_SET_CLIENT=utf8;
    SET CHARACTER_SET_RESULTS=utf8;
1 голос
/ 28 октября 2014
SELECT name 
       FROM gallery 
       WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' 
       GROUP BY name COLLATE utf8_general_ci LIMIT 5 
1 голос
/ 24 апреля 2014

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

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

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

Странно, но это так:)

...