2010-09-16 165 views
5

進出口使用以下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"); 

「內容」字段是包含鳴叫的文本字段。

我的問題是,如果我搜索「小號 tackoverflow」我得到的所有包含「#1」的結果,但沒有結果文本爲「小號 tackoverflow」。基本上搜索區分大小寫。

是否有可能更改查詢或PHP,所以當搜索'Stackoverflow'返回大小寫結果?

回答

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小寫。

您可以按照其他答案中的建議在查詢中進行這兩項更改。

+0

作爲PHP新手,我最簡單的解決方案。 – CLiown 2010-09-16 11:36:32

+1

最簡單!=最好。這不會對任何可能的索引有利,而且可能會更慢。 (說這個浮誇的白癡實際上只是因爲沒有人關心MySQL中這麼簡單的不區分大小寫排序而感到難過)。 – Wrikken 2010-09-16 14:27:34

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」子句 - 不能使用索引。 – 2016-11-03 03:58:04

0

的MySQL> SELECT * FROM myDb.myTable WHERE用戶名= 'test980'; 1行中集合(0.00秒)

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

MySQL列可以通過使用binary關鍵字創建它們來區分大小寫。我懷疑這是你的問題。您可以修改該列不是二進制或將您的查詢更改爲:

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

儘管有 二進制字符集選擇,但它有效地使字符串比較不區分大小寫。

+0

'BINARY'和'UCASE'成本高昂,因爲索引無法使用。 – 2016-11-03 03:56:48

0

這是關於在創建MySql數據庫時選擇最佳排序規則。

  • utf8_unicode_ci是很有用的,如果你想例如德國字符集準確排序,但它很慢。
  • utf8_general_ci默認是創建MySQL數據庫字符集utf8時的標準,它是最快的,但不區分大小寫。
  • 經驗法則:在MySQL上始終使用utf8_general_ci,並在需要區分大小寫的情況下整理utf8_bin或在語句中使用SELECT BINARY。
1

更改該列在問題(content)的COLLATION是不區分大小寫,如utf8mb4_unicode_ci

在PHP中進行摺疊的情況代價昂貴且效率低下。