MySQL全文搜索斯堪的纳维亚字符øæ

时间:2019-03-29 03:39:12

标签: mysql utf-8 character-encoding full-text-search multilingual

这是我可以找到的唯一关于此问题的问答,但似乎没有回答这个问题:Fulltext search with nordic letters (æ, ø, å)

在MySQL中,我有一个名为“ JohnNørbæk”的用户。

我希望能够在搜索时匹配此用户:

“ Noerbaek”,“Nørbaek”或“Noerbæk”

(也可以匹配“ Norbaek”,这很好,但我的Google专家建议ø等于“ oe”而不是“ o”,所以现在要求这样做是错误的。)

我正在使用utf8mb4_unicode_ci

我在这里创建了一个SQL Fiddle:http://sqlfiddle.com/#!9/b5be3d4/3

我在网上提出的所有结果似乎都与PHP有关,并用str_replace替换了这些字符,但是如果我的数据库中的内容是“Nørbæk”,那就没有帮助了。

我不能做这样的事情,因为匹配的字符串需要在全文索引中:

SELECT * FROM users WHERE MATCH (REPLACE(`name`, 'æ', 'ae'))
AGAINST ('Nørbaek' IN BOOLEAN MODE);

这是可行的,但在搜索“ Michael”之类的内容时当然会失败,因为它将被转换为Michæl,所以这是不可能的。

SELECT * FROM users WHERE MATCH (`name`)
AGAINST (REPLACE('Nørbaek', 'ae', 'æ') IN BOOLEAN MODE);

所以我全无想法,必须有一种更好的方法来匹配这些字符,对吗?

我对可用性更感兴趣。

例如,如果年长的用户想要找到他们的“Nørbæk博士”,他们需要能够输入能够找到他的东西,而不仅仅是告诉他们学习如何键入“ø”。

1 个答案:

答案 0 :(得分:1)

如约翰所展示的,

MATCH(col) AGAINST('Nørbæk' ...)

成功

  • IN BOOLEAN MODEIN NATURAL LANGUAGE MODE
  • col = 'Norbaek'
  • {{1}中Nørbæk的其他变体,
  • 5.6(和presumaby更高版本)
  • 具有排序规则AGAINST(或utf8_unicode_520_ci)。

http://mysql.rjweb.org/utf8_collations.htmlhttp://mysql.rjweb.org/utf8mb4_collations.html显示任一字符集的520归类的以下等效类:

utf8mb4_unicode_520_ci

因此,鉴于排序规则,无需进行A=a=ª=À=Á=Â=Ã=Ä=Å=à=á=â=ã=ä=å=Ā=ā=Ă=ă=Ą=ą ae=Æ=æ O=o=º=Ò=Ó=Ô=Õ=Ö=Ø=ò=ó=ô=õ=ö=ø=Ō=ō=Ŏ=ŏ=Ő=ő=Ơ=ơ oe=Œ=œ ;而是为该列指定排序规则(utf8_unicode_520_ci或utf8mb4_unicode_520_ci)