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



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



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


Это прекрасно работает, но не если дерево называется вяз или Карагач и т. д...



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



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

665   12  

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. 

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

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

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

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

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

например.

(вместо utf8_general_ci С любыми параметрами сортировки, которые вы найдете полезными). Элемент _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, как оператор есть insensitive...so если ваша долина-это вяз или вяз, вяз или вяз или любой другой , и вы используете как " %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 

Comments

    Ничего не найдено.