我们有一个包含作者表的MySQL数据库。一些作者的名字中有非英文字符(例如LÜTTGE)。
我们的客户希望用户能够找到这样的记录,即使他们没有输入非英文字符。所以在上面的例子中,“LUTTGE”也应该找到那个结果。目前它仅在用户使用非英文字符搜索名称时才有效,因此“LÜTTGE”可以正常工作,但“LUTTGE”不返回任何内容。
这是一个用CakePHP 2编写的Web应用程序
有没有人对如何做到这一点有任何想法,因为我不知所措?理想情况下,我们希望能够在CakePHP / MySQL中执行此操作,而不是使用第三方搜索系统。
以上只是数千条记录表中的一个例子。所以这不仅仅是用“Ü”代替“U” - 还有很多其他变种。
答案 0 :(得分:0)
这可以通过使用MySQL整理系统来处理。
例如,以下查询返回true
(1
)值:
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
所以你还需要一些额外的工作来处理音译。