在搜索包含德语变音符号(ä,ö,ü)的单词时,只有当我使用'o'代替'ö'

时间:2016-09-02 09:42:31

标签: mysql collation

我有一个使用mysql的web应用程序。我正在使用mysql 5.5,我的字符集是UTF-8,整理是utf8_general_ci。我有一个问题,如果我在我的网络应用程序中搜索像Jöhn这样的术语我没有得到任何结果,虽然在数据库中有一个条目作为Jöhn。字符串正确存储在数据库中。如果我用'o'而不是'ö'搜索结果(即)如果我将搜索词设为'john'我在搜索结果中得到'jöhn'。我没有像john这样的任何其他条目。唯一的条目是使用德语变音符号即jöhn。

2 个答案:

答案 0 :(得分:1)

让我逐步了解可能的情况......

在大多数排序规则中,单个字符ö(十六进制C3B6)通常被视为与o相同,包括utf8_general_ci。你可以在

中看到这一点
SELECT 'o' = 'ö' COLLATE utf8_general_ci;  --> 1 (meaning True)

utf8 collations。 8种其他的校对(bin,danish,icelandic,swedish,estonian,turkish,hungarian和german2)对待它们的方式不同。

至少有一种方法可以将ö写成两个字符:UNHEX('CC886F')是'组合diaeressis'加'o'。

SELECT UNHEX('CC886F') = 'o' COLLATE utf8_unicode_ci; --> 1
SELECT UNHEX('CC886F') = 'o' COLLATE utf8_general_ci; --> 0

回到问题...如果ö实际上是两个字符,那么你确实需要utf8_unicode_ci。如果你能得到HEX,请检查上面列出的十六进制。

对于“如果我在我的网络应用程序中搜索像Jöhn这样的术语,我没有得到任何结果的唯一方法,尽管数据库中有一个条目作为Jöhn”会发生这两个角色的渲染。

(所以我同意罗宾,但我希望这能说明“为什么”。)

答案 1 :(得分:0)

使用归类utf8_unicode_ci。这应该可以解决问题。