【问题标题】:MySQL does not treat ı as i?MySQL 不将 ı 视为 i 吗?
【发布时间】:2020-03-31 08:12:39
【问题描述】:

我在 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 的用户。

我是否必须使用不同的排序规则来支持所有变音符号?

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

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

【问题讨论】:

  • 仅通过查看这些字母很难分辨。您能否将 Unicode 代码点及其名称添加到您的问题中
  • @deceze 谢谢,但我想如果我使用土耳其语排序规则,那么我会遇到其他变音符号的麻烦吗?我需要支持来自所有国家/地区的变音符号。
  • @JGNI 我附上了问题中 unicode 变音符号的详细描述。
  • 好的,新信息,您可以针对特定查询使用不同的排序规则进行查询,如下所述:stackoverflow.com/a/2607164/916000。那你可以试试吗:select id from users where name='Yilmaz' COLLATE utf8_general_ci;

标签: mysql unicode encoding collation


【解决方案1】:

参考 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 并且在同时忽略变音符号。

警告:“一般”排序规则一次不会测试多个字符。也就是说,“无间距变音符号”加上元音不会被视为等于组合。

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

【讨论】:

  • 太完美了,这个页面正是我想要的。简而言之,不幸的是,没有任何排序规则可以统治所有这些。也许我需要做这样的事情:select * from .. where (a = b COLLATE utf8_general_ci )or where a=b;?
  • 为什么表中有多个列? aeazbz等是什么意思?
  • @Adam - 我在回答中添加了解释 ae、az 等的内容。
  • @Adam - 并且...确实,没有单一的排序规则。 (但是土耳其语中的 4 I's 有点棘手。)使用带有两个不同排序规则的OR 将导致全表扫描;即不能使用索引。
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多