Как я могу искать (без учета регистра) в столбце, используя подстановочный знак?
Я огляделся и не нашел то, что мне было нужно, так что здесь идет.
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.
Это также перестроит любые индексы в этом столбце, чтобы они могли использоваться для запросов без ведущего"%"
чувствительность к регистру определяется в параметрах сортировки столбцов / таблиц / базы данных. Вы можете выполнить запрос под определенной сортировкой следующим образом:
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