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

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

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

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

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

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

12 ответов


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. 

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


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

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

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

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

например.

(вместо utf8_general_ci С любыми параметрами сортировки, которые вы найдете полезными). The _ci расшифровывается как регистр.


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

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

теперь, без учета регистра, используя LOWER () func:

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

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

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

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

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

просто использовать :

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

Или Использовать

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

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


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

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

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

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

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


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


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

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

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

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


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