2014-02-12 145 views
0

我使用php和mysql創建搜索引擎。Mysql LIKE子句和口音

它可以工作,但是如果我搜索「publié」這個詞,它不會找到任何東西,但是如果我搜索單詞「Publie」,它會顯示嵌入術語「publie」和「publié」的結果。

如何使口音敏感的搜索只得到與我要求的結果完全一致,帶或不帶口音?

下面是我用一個典型的請求:

$requete4 = mysql_query(" 
    SELECT 
     title, 
     description, 
     CONCAT(
      IF (title LIKE '%".search_word."%', '1', '0'), 
      IF (description LIKE '%".$search_word."%', '1', '0-') 
     ) AS match_bitmask 
    FROM mytable 
    WHERE 
    (
     title LIKE '%".$search_word."%' OR 
     description LIKE '%".$search_word."%' 
    ) 
    ORDER BY id DESC 
"); 

注1:我的所有表,VARCHAR處理並在MySQL文本字段utf8_general_ci。

注2:我試圖在請求結尾處添加「COLLATE utf8_general_ci」,但收到錯誤消息。

謝謝你的幫助。

+0

«我得到一個錯誤消息» - 你讀過了嗎? –

+0

「mysql_fetch_array():提供的參數不是有效的MySQL」。但是,除非使用Collat​​e子句,否則我的請求完全有效,不會生成任何異常。 – Baylock

+1

這是一個** PHP **錯誤消息,抱怨您嘗試從失敗的查詢中提取行。您還需要獲取** MySQL **錯誤。轉到['mysql_error()'手冊頁](http://php.net/mysql_error),滾過*不要使用此擴展名*紅色通知並查看示例。 –

回答

1

如何才能使搜索區分口音,只得到與我要求的結果完全一致,帶或不帶口音?

使用utf8_bin排序規則。無論是—

  • 改變列的排序規則:

    ALTER mytable 
        MODIFY title  <datatype> COLLATE utf8_bin, 
        MOFIFY description <datatype> COLLATE utf8_bin; 
    
  • 明確指定歸類到每個LIKE表達式中使用:

    SELECT 
         title, 
         description, 
         CONCAT(
          IF (title LIKE '%".$search_word."%' COLLATE utf8_bin, '1', '0'), 
          IF (description LIKE '%".$search_word."%' COLLATE utf8_bin, '1', '0-') 
         ) AS match_bitmask 
        FROM mytable 
        WHERE 
        (
         title LIKE '%".$search_word."%' COLLATE utf8_bin OR 
         description LIKE '%".$search_word."%' COLLATE utf8_bin 
        ) 
        ORDER BY id DESC 
    
+0

嗯,我不知道爲什麼,「校對」子句總是給我一個錯誤信息。我只是把它完全按照你的建議,就在「like」子句後面,我爲每一行添加了「Collat​​e」,並得到一個「mysql_fetch_array():提供的參數不是有效的MySQL」。該消息本身與「整理」無關,但似乎它破壞了某些內容。請記住,我不必更改表格,因爲所有的數據庫,表格和字段都已使用UTF8。我剛剛檢查過。謝謝你的幫助 – Baylock

+1

@Baylock:只是因爲列被*編碼*在UTF-8中不會**意味着他們將默認使用'utf8_bin' *排序規則*,這就是上面的'ALTER TABLE'命令旨在改變。但是,上面的'SELECT'語句沒有錯(見[sqlfiddle](http://sqlfiddle.com/#!2/070f0f/2)) - 所以你的查詢必須由於其他問題而失敗:建議你輸出'mysql_error()'的結果來查看結果。 – eggyal

+0

好吧,你是對的,錯誤是這樣的:「COLLATION'utf8_bin'對於CHARACTER SET'latin1'」無效。我有數百個表格行,我無法一個一個地針對他們所有的腳本運行腳本。所以我找到了這個:「https://confluence.atlassian。com/display/CONFKB/How + to + Change + All + Columns'+ Collat​​ion + to + utf8_bin + in + MySQL「我做了所有事情,之後,一切都是utf8_bin,但之後我運行的是相同的問題,同樣的錯誤信息如果我使用Collat​​e。 – Baylock