Mysql LIKE子句和重音

时间:2014-02-12 15:02:56

标签: mysql utf-8 special-characters sql-like

我正在用php和mysql创建一个搜索引擎。

它有效但如果我搜索“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:Mysql中的所有表,varchars和文本字段都是utf8_general_ci。

注意2:我尝试在请求结束时添加“COLLATE utf8_general_ci”,但收到错误消息。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

  

我如何才能使搜索重音敏感,只获得与我要求的完全匹配的结果,无论是否有重音?

使用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