我使用以下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”时返回大写和小写结果?
答案 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
全部小写。content
到lower(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数据库时选择最佳排序规则。
答案 6 :(得分:0)
请注意,如果您使用的是另一种语言,并且您使用的是“ strtolower()”,它不会将特殊字符(非英文字母)转换为小写字母,这将完成mb_strtolower($ text,'utf8');