我在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
(传统西班牙语)。