Как я могу искать (без учета регистра) в столбце с использованием шаблона 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