使用外语和英语字符获取相同的MySQL搜索结果

时间:2014-08-08 13:27:48

标签: mysql search cakephp-2.0 search-engine collation

我们有一个包含作者表的MySQL数据库。一些作者的名字中有非英文字符(例如LÜTTGE)。

我们的客户希望用户能够找到这样的记录,即使他们没有输入非英文字符。所以在上面的例子中,“LUTTGE”也应该找到那个结果。目前它仅在用户使用非英文字符搜索名称时才有效,因此“LÜTTGE”可以正常工作,但“LUTTGE”不返回任何内容。

这是一个用CakePHP 2编写的Web应用程序

有没有人对如何做到这一点有任何想法,因为我不知所措?理想情况下,我们希望能够在CakePHP / MySQL中执行此操作,而不是使用第三方搜索系统。

以上只是数千条记录表中的一个例子。所以这不仅仅是用“Ü”代替“U” - 还有很多其他变种。

1 个答案:

答案 0 :(得分:0)

这可以通过使用MySQL整理系统来处理。

例如,以下查询返回true1)值:

SELECT 'LÜTTGE' COLLATE utf8_general_ci = 'LUTTGE'

因此,如果您将列的字符集设置为utf8并将其整理设置为utf8_general_ci,您将获得使用变音字符提及的结果。

MySQL中的默认排序规则反映了其瑞典语来源,并且是utf8_swedish_ci。在瑞典语中,Ü和U不是同一个字母。您可能已经使用了列的默认排序规则。

utf8_general_ci归类处理将'Eßen'与'Esen'匹配,但不匹配'Essen'。不幸的是,它将'LÜTTGE'与'LUTTGE'匹配,而不是'Luettge'。

另一方面,utf8_german2_ci整理将'Eßen'与'Essen'和'LÜTTGE'匹配为'LUETTGE'。如果您的用户习惯使用德语字符的ASCII音译,您可以在此处探索您的选择。其中之一是使用OR

的查询
 SELECT whatever 
   FROM table
  WHERE (    namen COLLATE utf8_general_ci = 'LUTTGE'
          OR namen COLLATE utf8_german2_ci = 'LUTTGE'  )

如果您需要处理西班牙语,可能会变得更复杂,因为Ñ被视为与N不同的字母。您可能需要为您的用户做一些解释。

Marcus建议使用utf_unicode_ci整理。那将部分处理事情。以下是案例

                       type        utf8_general_ci  utf8_german2_ci   utf8_unicode_ci utf8_spanish_ci
'Eßen' to 'Esen'       substitute      match            no match        no match         no match
'Eßen' to 'Essen'      transliterate   no match         match           match            match
'LÜTTGE' to 'LUTTGE'   substitute      match            no match        match            match
'LÜTTGE' to 'LUETTGE'  transliterate   no match         match           no match         no match
'Niño'   to 'Nino'     transliterate   match            match           match            no match

所以你还需要一些额外的工作来处理音译。