MySQL - поиск без учета регистра

Создание моей поисковой системы для пользователей для поиска трех переменных $Title, $Text и $Number... Как мне это сделать, когда пользователь выполняет поиск, он находит все результаты независимо от типа регистра (нижний или верхний регистр), введенного пользователем в $query ?

$query = trim ($query);

$raw_results = mysql_query("SELECT * FROM posts
        WHERE (`Number` LIKE '%".$query."%') OR (`Title` LIKE '%".$query."%') OR (`Text` LIKE '%".$query."%') ") or die(mysql_error());

person user2129470    schedule 03.03.2013    source источник
comment
Функции mysql_* устарели (см. красное поле). Более того, я не вижу, чтобы вы использовали mysql_real_escape_string и экранировали все экземпляры _ и %.   -  person Marcel Korpel    schedule 03.03.2013
comment
Тем не менее, этот вопрос связан с запросом, а не с методом, которым он вызывается.   -  person Captain Ford    schedule 03.03.2013
comment
@CaptainFord: Вот почему я разместил свое замечание в качестве комментария.   -  person Marcel Korpel    schedule 03.03.2013


Ответы (4)


Используйте сопоставление без учета регистра.

SELECT * FROM posts
WHERE (`Number` LIKE '%".$query."%') 
OR (`Title` LIKE '%".$query."%') 
OR (`Text` LIKE '%".$query."%')
COLLATE utf8_ci  --'ci' stands for case insensitive: choose the colaltion that fits your encoding

Список поддерживаемых сопоставлений находится здесь: https://dev.mysql.com/doc/refman/5.5/en/charset-charsets.html

person Mchl    schedule 03.03.2013

Вы можете использовать функцию mysql LOWER():

$query=strtolower($query); //Query to lower case
$raw_results = mysql_query("SELECT * FROM posts
    WHERE (LOWER(`Number`) LIKE '%".$query."%') OR (LOWER(`Title`) LIKE '%".$query."%') OR (LOWER(`Text`) LIKE '%".$query."%') ") or die(mysql_error());

Однако функция mysql в php устарела, вы должны использовать mysqli вместо mysql.

person BackSlash    schedule 03.03.2013
comment
Этот фрагмент не обеспечивает никакой защиты от инъекций. - person mickmackusa; 07.04.2021
comment
@micmackusa Как и тот, о котором идет речь. Вопрос был о том, как бороться с поиском без учета регистра, и ответ сосредоточен на этом. Можно также утверждать, что mysql_* API устарел в php5 и удален в php7, но опять же, это не было предметом вопроса. На самом деле обе проблемы уже были рассмотрены в комментариях к вопросу :) - person BackSlash; 07.04.2021
comment
Для вопросов нормально иметь ошибочный код (мы хотим, чтобы OP опубликовали свою попытку в знак уважения к волонтерам, предоставили контекст и потенциально сузили масштаб проблемы. С другой стороны, ожидается, что ответы будут содержать лучшие практики и высококачественные идеи Если у вас есть время, чтобы улучшить этот старый ответ, пожалуйста, сделайте это для улучшения SO Мой первоначальный комментарий был только для того, чтобы предупредить разработчиков копипасты, что они не должны копировать этот ответ. - person mickmackusa; 07.04.2021

MySQL нечувствителен к регистру для char, varchar и text (недвоичные строки) по умолчанию.

person Explosion Pills    schedule 03.03.2013
comment
Зависит от сопоставления по умолчанию. См. ссылку в ответе Мхл. - person Captain Ford; 03.03.2013

Одна вещь, которую я сделал в своей собственной базе данных для компании, это сделать все в верхнем регистре с помощью функции strtoupper() в PHP (специально из соображений личной безопасности). Также было бы полезно, если бы вы использовали параметры сортировки utf8_ci в своих полях, которые вы хотите сделать нечувствительными к регистру.

person Jacob Cannon    schedule 03.03.2013
comment
Это удалит все форматирование из текста, поэтому для таких вещей, как заголовок, это плохое решение. - person Maciej Paprocki; 27.01.2014