MySQL - 不区分大小写搜索

5

我正在为用户构建搜索引擎,以便他们可以搜索三个变量$Title、$Text和$Number... 当用户进行搜索时,如何使它能够查找到所有的结果,不管用户键入的是大写字母还是小写字母?

$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());

mysql_* 函数已被弃用(请参见红框)。此外,我看不到您使用 mysql_real_escape_string 并转义所有的 _% - Marcel Korpel
1
然而,这个问题与查询有关,而不是调用查询的方法。 - Captain Ford
@CaptainFord:这就是我将我的评论发布为评论的原因。 - Marcel Korpel
4个回答

5

3

您可以使用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());

然而,PHP中的mysql函数已被弃用,您应该使用mysqli代替mysql。


此代码片段不提供任何防止注入攻击的保护。 - mickmackusa
@mickmackusa,问题中也没有提到这一点。问题是关于如何处理大小写不敏感搜索,而答案则侧重于此。有人可能会认为,在php5中已经弃用了mysql_* api,并在php7中删除了它,但这也不是问题的范围。实际上,这两个问题已经在问题的评论中得到了解决 :) - BackSlash
问题中出现错误的代码是可以的(我们希望提问者发布他们的尝试作为对志愿者的尊重,提供上下文,并可能缩小问题的范围)。另一方面,回答应该包含最佳实践和高质量的见解。如果您有时间改进这个旧答案,请为了SO的发展而这样做。我的初始评论只是为了警告那些复制粘贴开发人员不要复制粘贴这个答案。 - mickmackusa

1

取决于默认排序规则。请参见Mchl答案中的链接。 - Captain Ford

-1

在我为一家公司创建的自己的数据库中,我使用了 PHP 中的 strtoupper() 函数将所有内容转换为大写(特别是出于个人安全原因)。如果您希望字段不区分大小写,使用 utf8_ci 排序规则也会有所帮助。


1
这将从文本中删除所有格式,因此对于标题等内容来说,这是不好的解决方案。 - Maciej Paprocki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接