MySQL 不把 ı 当作 i?

MySQL does not treat ı as i?

我在 MySQL 5.7.27 中有一个用户 table,排序规则 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 的用户。

我是否必须使用不同的归类来支持所有元音变音?

以下是有关 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=ı 排在其他带重音符号的 I 之前。在所有其他排序规则中,ı 排在所有 I 之后,就好像它被视为一个单独的字母一样。

同时 İ=I 在除 utf8_turkish_ci 之外的所有排序规则中。

情节随着 MySQL 8.0 变厚。 utf8mb4_tr_0900_ai_ci(仅)有此顺序:

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

同时 ä=Ä 并且它们与大多数排序规则(包括土耳其语排序规则)的大多数其他带重音符号的 A 相匹配。

底线:似乎 utf8[mb4]_general_ci 是 5.7 或 8.0 中唯一始终将 dotless-i(或 dotted-I)视为等于 'regular i/I 同时忽略变音符号。

警告:"general" 排序规则一次测试的字符不超过一个。也就是说,"non-spacing umlaut"加上元音不会被视为等于组合。

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