PHP / Mysql搜索 - 区分大小写

时间:2010-09-16 10:46:02

标签: php mysql

我使用以下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字段。

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

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

7 个答案:

答案 0 :(得分:4)

您可以尝试:

$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子句中我改变了 contentlower(content)这样 我比较小写 content

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

答案 1 :(得分:3)

强制搜索词和列值的情况:

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

答案 2 :(得分: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)

答案 3 :(得分:1)

将相关列COLLATION更改为不区分大小写,例如content

使用PHP进行大小写折叠是昂贵且低效的。

答案 4 :(得分:0)

的MySQL> SELECT * FROM myDb.myTable WHERE username ='test980'; 1行(0.00秒)

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

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

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

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

答案 5 :(得分:0)

在创建MySql数据库时选择最佳排序规则。

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

答案 6 :(得分:0)

请注意,如果您使用的是另一种语言,并且您使用的是“ strtolower()”,它不会将特殊字符(非英文字母)转换为小写字母,这将完成mb_strtolower($ text,'utf8');

相关问题