PHP/MySQL搜索 - 区分大小写

5
我正在使用以下PHP和MySQL从表中获取行:
$search_word=$_GET['search_word'];
$search_word_new=mysql_escape_string($search_word);
$search_word_fix=str_replace(" ","%",$search_word_new);
$sql=mysql_query("SELECT * FROM tweets WHERE content LIKE '%$search_word_fix%' ORDER BY votes DESC LIMIT 20");

'content'字段是一个包含推文的TEXT字段。

我的问题是,如果我搜索“Stackoverflow”,我会得到所有包含“Stackoverflow”的结果,但当文本为“stackoverflow”时没有结果。基本上搜索区分大小写。

是否可能更改查询或PHP,以便在搜索“Stackoverflow”时返回大小写结果?

7个回答

5
您可以尝试以下方法:
$search_word_fix=strtolower(str_replace(" ","%",$search_word_new));
$sql=mysql_query("SELECT * FROM tweets WHERE lower(content) LIKE '%$search_word_fix%' ORDER BY votes DESC LIMIT 20");
  • 我添加了 strtolower 以使 $search_word_fix 变为小写。
  • 在 where 子句中,我将 content 改为 lower(content),这样我就可以与 content 的小写进行比较。

您可以按照其他答案中建议的方式在查询中进行这两个更改。


作为一个 PHP 初学者,对我来说最简单的解决方案。 - CLiown
1
最简单并不代表最好。这种方法无法充分利用可能存在的索引,而且很可能速度较慢。(自以为是的白痴如此说道,实际上只是因为没有人关心MySQL中那么容易的不区分大小写排序)。 - Wrikken

4

强制搜索词和列值的大小写:

SELECT * FROM tweets WHERE LOWER(content) LIKE LOWER('%$search_word_fix%') ORDER BY votes DESC LIMIT 20

或者:

SELECT * FROM tweets WHERE UPPER(content) LIKE UPPER('%$search_word_fix%') ORDER BY votes DESC LIMIT 20

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html


3

正确的做法是将其设置为不区分大小写的排序规则:

CREATE TABLE foo (col1 varchar(24) COLLATE utf8_bin,col2 varchar(24) COLLATE  utf8_general_ci);
Query OK, 0 rows affected (0.03 sec)

DB 5.1.49-1-log:test  mysql> INSERT INTO foo VALUES ('stackoverflow','stackoverflow');
Query OK, 1 row affected (0.01 sec)

DB 5.1.49-1-log:test  mysql> SELECT * FROM foo WHERE col1 LIKE 'Stackoverflow';
Empty set (0.00 sec)

DB 5.1.49-1-log:test  mysql> SELECT * FROM foo WHERE col2 LIKE 'Stackoverflow';
+---------------+---------------+
| col1          | col2          |
+---------------+---------------+
| stackoverflow | stackoverflow |
+---------------+---------------+
1 row in set (0.00 sec)

DB 5.1.49-1-log:test  mysql> SELECT * FROM foo WHERE col1 COLLATE utf8_general_ci LIKE 'Stackoverflow';
+---------------+---------------+
| col1          | col2          |
+---------------+---------------+
| stackoverflow | stackoverflow |
+---------------+---------------+
1 row in set (0.00 sec)

1
除非你无法更改列的排序规则,否则不要使用COLLATE子句——这将导致不能使用索引。 - Rick James

1
将问题列(content)的 COLLATION 更改为不区分大小写,例如 utf8mb4_unicode_ci
在 PHP 中进行大小写折叠是昂贵且低效的。

0
请注意,如果您正在使用另一种语言并且使用了 "strtolower()" 函数,它不会将特殊字符(非英文字母)转换为小写。为此,可以使用 mb_strtolower($text, 'utf8') 函数来完成这项任务。

0

mysql> SELECT * FROM myDb.myTable WHERE username = 'test980'; 1行记录(0.00秒)

mysql> SELECT * FROM myDb.myTable WHERE username = 'TEST980'; 空集(0.00秒)

通过使用二进制关键字创建列,MySQL列可以区分大小写。我怀疑这是您的问题。您可以修改列以不是二进制的方式,或更改查询为:

SELECT * FROM myDb.myTable WHERE UCASE(username) = 'TEST980';

这有效地使字符串比较不区分大小写,尽管选择了二进制字符集。


BINARYUCASE是昂贵的,因为索引无法使用。 - Rick James

0

在创建MySql数据库时,选择最佳排序规则是非常重要的。

  • 如果您想准确地对德语字符集进行排序,则utf8_unicode_ci很有用,但速度较慢。
  • 当创建MySQL数据库字符集为utf8时,默认的标准是utf8_general_ci,它是最快的,但不区分大小写。
  • 经验法则:在MySQL上始终使用utf8_general_ci,如果需要区分大小写,请使用collate utf8_bin或在语句中使用SELECT BINARY。

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