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