2010-08-31 37 views
4

我的SQL查詢
SELECT keyword
FROM table
WHERE MATCH (keyword)
AGAINST ('eco*' IN BOOLEAN MODE);

匹配的細胞用這句話:economyecologyechoscopy(爲什麼?),echo(爲什麼?)等全文搜索的MySQL的奇怪的結果,需要一個解釋

其他SQL查詢
SELECT keyword
FROM table
WHERE MATCH (keyword)
AGAINST ('eci*' IN BOOLEAN MODE);

匹配單詞的單詞:echidna

查詢不匹配字ectoplasm

爲什麼echo,echoscopy匹配'eco*'echidna匹配'eci*'

我看到這個問題的關鍵要素是字母組合「ch」。

它爲什麼這樣工作,我該如何避免這種匹配?

回答

1

問題(特徵?)在整理中。由於utf8_lithuanian_ci整理,「c」和「ch」被視爲相等。

編輯:

更改排序規則utf8_unicode_ci僅修復某些問題。

真正的解決方案是使用utf8_bin,它匹配每個字符的二進制值,這意味着它是:

  • 區分大小寫
  • 變音符號敏感
+0

非常有趣。排序規則絕對是在MySQL中值得注意的事情... – Avi 2010-09-01 14:21:33

-1

也許你可以試試這個

SELECT keyword FROM table WHERE keyword LIKE 'eco%'; 
+0

對不起,不能使用LIKE - 它太慢了。 – Adomas 2010-08-31 13:17:13

+0

應儘可能避免LIKE查詢,特別是在大型數據集上。 FULLTEXT索引是需要的,這是OP需要幫助的。 – SHaKie 2015-04-30 10:50:54

0

它匹配的原因是,MATCH ... AGAINST使用正則表達式,而*意味着,前面的字符(「O」)可以有從0到9999999999999999999 ^次。你想匹配的是

eco.* 

將匹配「生態」和「生態」,但不是「回聲」。

eco.+ 

將匹配「生態」和「生態系統」,但不是「生態」或「回聲」。

+0

MATCH ... AGAINST不使用正則表達式,它進行全文搜索。請參閱Adomas的答案以解釋發生的事情。 – Avi 2010-09-01 14:20:24

+0

你注意到Adoma是OP嗎?所以我猜他已經「注意到」了..關心.. :-) – 2010-09-01 16:24:36