使用二进制排序规则有什么影响?

What effects does using a binary collation have?

提问人:Pekka 提问时间:4/3/2011 最后编辑:ashleedawgPekka 更新时间:10/17/2020 访问量:29242

问:

在回答这个问题时,我不确定一些我没有找到足够答案的事情。

使用二进制排序规则和不区分大小写的排序规则之间有什么实际区别?utf8_binutf8_general_ci

我可以看到三个:

  1. 两者都有不同的排序顺序;的排序顺序可能会将任何变音符号放在字母表的末尾,因为字节值是比较的(对吧?_bin

  2. 中仅搜索区分大小写_bin

  3. 没有平等A = Ä_bin

是否有任何其他差异或副作用需要注意?

参考:

无法解决问题的类似问题:

MySQL 数据库 二进制 字符串比较 排序规则

评论


答:

76赞 Vladislav Vaintroub 4/4/2011 #1

二进制排序规则会像在 C 中一样比较字符串,如果字符不同(无论是大小写还是变音符号不同)。它的缺点是排序顺序不自然。strcmp()

非自然排序顺序的一个例子(如“二进制”是):在这种情况下,自然排序顺序将是:(同一字母的小变体和大写变体彼此相邻排序)A,B,a,bA,a,B,b

二进制排序规则的实际优势是它的速度,因为字符串比较非常简单/快速。在一般情况下,带有二进制的索引可能不会产生预期的排序结果,但对于精确匹配,它们可能很有用。

评论

0赞 Pekka 5/4/2011
感谢您的示例,它们很好地说明了这个问题。
0赞 shashi009 4/14/2016
万一,我需要区分大小写的比较,涉及相当大的表(就数据量而言~超过 400 万条记录)。我最近遇到了这个问题,使用utf_8_unicode_ci排序规则,我的查询在性能方面做得很好,但没有产生完全匹配。如果我将排序规则更改为utf8_bin,它的性能就会消失......在性能方面有很大的差异
3赞 Vladislav Vaintroub 10/21/2016
对上述内容进行小幅修正..它几乎可以像 strcmp() 一样工作,但不是 100% 完全。根据 SQL 标准,需要比较不同长度的字符串,就好像用空格字符 (0x20) 填充较短的字符串一样,直到较大字符串的长度。在大多数情况下,它的行为类似于 strcmp(),但在涉及字节< 0x20(空格)的退化情况下,它不会。例如,'a\t'('a' 后跟 TAB)小于 'a'(a 后跟空格),因此 'a\t' < 'a' 。MariaDB 10.2 引入了 NOPAD 排序规则,这些排序规则与 strcmp() 行为完全匹配,(jira.mariadb.org/browse/MDEV-9711)
1赞 Mathieu Rodic 5/5/2011 #2

使用 utf8_general_ci 时,匹配不会考虑大小写和重音。当您需要对单词执行查询时,这可能是一件好事。

utf8_bin 中,仅当字符串严格相同时才会发生匹配。这样查询速度更快。

评论

0赞 Yousha Aleayoub 5/17/2017
utf8_bin 比 latin1_bin 或 ascii_bin 快吗?
2赞 Mathieu Rodic 5/23/2017
不可以,但_bin应该比_ci快,因为不区分大小写的查询(或索引)涉及字符串转换。了解速度的最好方法是针对包含许多条目的数据库进行测试。
20赞 HaloWebMaster 5/5/2011 #3

utf8_bin:通过字符串中每个字符的二进制值来比较字符串。

utf8_general_ci:使用常规语言规则和不区分大小写的比较来比较字符串。

utf8_general_cs:使用常规语言规则和区分大小写的比较来比较字符串。

例如,以下命令将使用任一排序规则计算为 true,但不会使用排序规则计算为 true:UTF8_generalutf8_bin

Ä = A Ö = O Ü = U

通过排序规则,即使大小写不同,它们也会返回。http://www.phpbuilder.com/board/showpost.php?s=2e642ac7dc5fceca2dbca1e2b9c424fd&p=10820221&postcount=2utf8_general_citrue

评论

2赞 Yousha Aleayoub 5/17/2017
*_cs 比 *_ci 快吗?对于英语/ASCII 字符串
2赞 bobflux 5/7/2011 #4

其他答案很好地解释了这些差异。

二进制排序规则在某些情况下很有用:

  • 列包含十六进制数据,如密码哈希
  • 您只对精确匹配感兴趣,对排序不感兴趣
  • 对于只有 [A-Z0-9_] 字符的标识符,您甚至可以使用它进行排序
  • 出于某种原因,您将数字存储在 CHAR() 或 VARCHAR 列中(如电话)
  • 邮政编码
  • UUID

在所有这些情况下,您都可以使用二进制排序规则节省(少量)CPU 周期。

评论

0赞 Yousha Aleayoub 5/17/2017
什么类型的二进制文件?ascii_bin、utf8_bin、latin1_bin等......?