我在MySQL 5.7.27中使用utf8mb4_unicode_ci排序规则的用户表。

不幸的是,例如ı不是像i那样被线程化,下面的查询找不到Yılmaz

select id from users where name='Yilmaz';


我对其他变音符号(如äa)没有问题。例如,两个查询给出的结果完全相同。

select id from users where name='Märie';

select id from users where name='Marie';


我不能简单地将ı替换为i并进行搜索,因为那样的话,我将找不到名称为Yılmaz的用户。

我是否必须使用其他排序规则来支持所有umlaute?

以下是有关unicode字母的更多信息:

code    | glyph |decimal |  html   | description
U+0131  |  ı    |305     |ı |  Latin Small Letter dotless I
U+0069  |  i    |105     |-        |  Latin Small Letter I

最佳答案

参考http://mysql.rjweb.org/utf8_collations.html,我在3个排序规则中看到了ı=i:utf8_general_ci,utf8_general_mysql500_ci,utf8_turkish_ci。但是,对于土耳其语排序规则,I=ı排在其他带有重音符号的我之前。在所有其他归类中,ı排在我的后面,好像它被当作一个单独的字母一样。

同时,除utf8_turkish_ci外的所有归类中的İ=I

随着MySQL 8.0的出现,情节变得更加浓厚。 utf8mb4_tr_0900_ai_ci(仅)具有以下顺序:

I=Ì=Í=Î=Ï=Ĩ=Ī=Ĭ=Į=ı sort before  i=ì=í=î=ï=ĩ=ī=ĭ=į=İ


同时ä=Ä,它们与大多数归类(包括土耳其语)的大多数其他带有重音符号的A相匹配。

底线:似乎utf8 [mb4] _general_ci是5.7或8.0中唯一的排序规则,该排序规则始终将无点i(或点分I)视为等于“常规i / I”,同时忽略变音符号。

注意:“一般”归类一次不能测试多个字符。也就是说,“非定调变音”加元音将不被视为等于组合。

在该链接中,对于某些排序规则,一个字符æ的排序与两个字母ae相同。表示为:Aa ae=æ az。在大约其他排序规则的一半中,字符æ被视为一个单独的字母;这可以通过在az之后和b之前来表示。甚至在zz之后进行斯堪的纳维亚归类。这种单独的字母概念有时适用于字母对,例如cs(匈牙利)和ch(传统西班牙语)。

07-24 09:25