gpt4 book ai didi

mysql - 使用外文和英文字符获得相同的 MySQL 搜索结果

转载 作者:行者123 更新时间:2023-11-30 22:58:23 27 4
gpt4 key购买 nike

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

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

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

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

以上只是数千条记录表中的一个例子。因此,这不仅仅是将“U”替换为“Ü”的情况 - 还有许多其他变体。

最佳答案

这可以通过使用 MySQL 排序规则系统来处理。

例如,以下查询返回一个 true (1) 值:

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

因此,如果您将列的字符集设置为 utf8 并将其排序规则设置为 utf8_general_ci,您将得到您提到的带有元音变音字符的结果。

MySQL 中的默认排序规则反射(reflect)了它的瑞典血统,即 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

因此您仍然需要一些额外的工作来处理音译。

关于mysql - 使用外文和英文字符获得相同的 MySQL 搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25204641/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com