2013-11-24 107 views
0

是否有可能使以下查詢字符串不區分大小寫?製作Mysql查詢案例Insentive

SELECT SUBSTR(raw,INSTR(raw,'".$term."') - 50,350) as term, 
(LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."',''))) /LENGTH('".$term."') AS occur,name,title 
FROM ( 
    SELECT (LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."','')))/LENGTH('".$term."') AS occur, raw, consol.name,title 
    FROM consol 
    WHERE LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."',''))>0 AND raw LIKE '%".$term."%' COLLATE utf8_general_ci ORDER BY occur DESC 
    ) t "; 

該表的引擎是MyISAM,編碼是UTF8。當我從命令行運行查詢它的作品,但是當我通過瀏覽器執行它時,會引發以下錯誤。

說明:失敗查詢:整理 'utf8_general_ci' 是無效的字符集 'latin1的' 在

該表以UTF-8編碼的utf8_general_ci的整理。我怎樣才能確保「小」的查詢匹配小,小或小?

+0

表的編碼/整理不一定等於任何給定列的編碼/整理。檢查你的列是否確實是utf8。 – Mchl

+0

該列的編碼是UTF-8 Unicode(utf8),排序規則是utf8_general_ci – user2355051

+0

看來這與LENGTH和REPLACE函數有關係嗎?那可能嗎? – user2355051

回答

0

看起來好像第二個select語句中的WHERE子句導致了問題。我改變了這一點:

WHERE LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."',''))>0 AND raw LIKE '%".$term."%' COLLATE utf8_general_ci ORDER BY occur DESC 

要這樣:

WHERE raw LIKE '%".$term."%' ORDER BY occur DESC 

看來現在匹配所有結果。初始查詢過濾器與第二個查詢匹配。它看起來像LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."',''))>0的WHERE條件導致了問題以及整理的設置。

1

使用strtolower()或類似的標準化您的$term變量,然後將其添加到您的查詢。

+0

馬爾科姆,表中的匹配可以是'小'或'小',如果用戶鍵入'小'或'小'或'小'等,它應該仍然返回結果。沒有辦法知道表中的數據是什麼樣子,因爲這是一個LONGTEXT字段。 – user2355051