2013-02-08 31 views
1

我目前正在開發網站的搜索功能。用戶按名稱搜索其他用戶。對於名稱上有重音的用戶,我會遇到一些麻煩。執行不區分重音的全文搜索MySQL

我在名稱列上有一個FULLTEXT索引,表的排序規則是utf8_general_ci。

目前,如果某人的網站註冊,與重音一個名稱(例如:阿爾貝託安德烈斯),名稱是存儲在DB如圖如下圖中:

Alberto Andrés

所以如果我執行以下查詢SELECT * MATCH(name) AGAINST('alberto andres'),我會得到許多結果,比如'Alberto','Andres','Andrés'等比賽得分更高,最終得分低的用戶可能正在尋找'AlbertoAndrés'的記錄。

我該如何考慮重音記錄當前存儲在數據庫中的方式?

謝謝!

回答

2

它在我看來像elSeñor的姓氏安德列斯實際上存儲正確。您向我們展示的呈現方式是一些非UTF應用程序打亂UTF8文本的方式。

如果您的表中尚未包含大量記錄,則可以嘗試對您的查詢進行修改。全文(非布爾)模式奇怪地適用於小數據集。

SELECT * 
    FROM TABLE 
WHERE MATCH(name) AGAINST('alberto andres' IN BOOLEAN MODE) 

您也可以嘗試

SELECT * 
    FROM TABLE 
WHERE MATCH(name) AGAINST(CONVERT('alberto andres' USING utf8)) 

只是爲了確保您的匹配字符串是在相同的字符集爲你的MySQL列。

+0

感謝Ollie爲您的答案!布爾模式不會改進結果。 '使用utf8'返回相同的記錄。有趣的是,如果我在php上執行utf8_encode('AlbertoAndrés')並將輸出傳遞給查詢,我確實會得到AlbertoAndrés作爲第一個結果。當用戶輸入沒有重音的名字時,我仍然沒有想出解決方案。 – fdezjose 2013-02-08 16:20:52