Я огляделся по сторонам и не нашел, что мне было после этого.
SELECT * FROM trees WHERE trees.`title` LIKE '%elm%'
Это работает отлично, но не если дерево называется Elm или ELM и т.д.
Как сделать SQL-регистр незаметным для этого поиска в wild-card?
Я использую MySQL 5 и Apache.
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.
Это также приведет к восстановлению любых индексов в этом столбце, чтобы они могли использоваться для запросов без указания "%"
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
любой сортировкой, которую вы сочтете полезной). _ci
означает нечувствительный к регистру.
utf8_general_ci
работает отлично, хотя.
COLLATE
либо сделать простой трюк, подобный этому ( LOWER()
обеих ваших строк перед сравнением)
Это пример простого запроса LIKE:
SELECT * FROM <table> WHERE <key> LIKE '%<searchpattern>%'
Теперь без учета регистра с использованием функции LOWER():
SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')
COLLATE
Я делаю что-то подобное.
Получение значений в нижнем регистре и 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%';
Вам не нужно ALTER
любую таблицу. Просто используйте следующие запросы перед фактическим SELECT
запросом, который вы хотите использовать подстановочный знак:
set names `utf8`;
SET COLLATION_CONNECTION=utf8_general_ci;
SET CHARACTER_SET_CLIENT=utf8;
SET CHARACTER_SET_RESULTS=utf8;
SELECT name
FROM gallery
WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%'
GROUP BY name COLLATE utf8_general_ci LIMIT 5
хорошо в mysql 5.5, как и оператор, нечувствителен... поэтому, если ваша vale является вязами или ELM или Elm или eLM или любым другим, и вы используете как "% elm%", он отобразит все соответствующие значения.
Я не могу сказать о более ранних версиях mysql.
Если вы идете в Oracle, например, работайте с учетом регистра, поэтому, если вы наберете "% elm%", он пойдет только для этого и игнорирует верхние регионы.
Странно, но так оно и есть:)
*_ci
, что означает «без *_ci
регистра». Поскольку это происходит по умолчанию для всех поддерживаемых наборов символов (введите код show character set;
чтобы проверить это) - ответ частично верен :-) Только причина неверна. Это не оператор, который нечувствителен к регистру, это сопоставление по умолчанию.
Вы должны настроить правильную кодировку и сопоставление для своих таблиц.
Кодирование таблицы должно отражать фактическое кодирование данных. Какова ваша кодировка данных?
Чтобы увидеть кодировку таблицы, вы можете запустить запрос SHOW CREATE TABLE tablename
Когда я хочу разрабатывать нечувствительные поисковые запросы, я всегда конвертирую каждую строку в нижний регистр, прежде чем выполнять сравнение
BINARY
например здесь: stackoverflow.com/questions/7857669/…