提问人:Pekka 提问时间:4/3/2011 最后编辑:ashleedawgPekka 更新时间:10/17/2020 访问量:29242
使用二进制排序规则有什么影响?
What effects does using a binary collation have?
问:
在回答这个问题时,我不确定一些我没有找到足够答案的事情。
使用二进制排序规则和不区分大小写的排序规则之间有什么实际区别?utf8_bin
utf8_general_ci
我可以看到三个:
两者都有不同的排序顺序;的排序顺序可能会将任何变音符号放在字母表的末尾,因为字节值是比较的(对吧?
_bin
中仅搜索区分大小写
_bin
没有平等
A = Ä
_bin
是否有任何其他差异或副作用需要注意?
参考:
无法解决问题的类似问题:
答:
二进制排序规则会像在 C 中一样比较字符串,如果字符不同(无论是大小写还是变音符号不同)。它的缺点是排序顺序不自然。strcmp()
非自然排序顺序的一个例子(如“二进制”是):在这种情况下,自然排序顺序将是:(同一字母的小变体和大写变体彼此相邻排序)A,B,a,b
A,a,B,b
二进制排序规则的实际优势是它的速度,因为字符串比较非常简单/快速。在一般情况下,带有二进制的索引可能不会产生预期的排序结果,但对于精确匹配,它们可能很有用。
评论
使用 utf8_general_ci 时,匹配不会考虑大小写和重音。当您需要对单词执行查询时,这可能是一件好事。
在 utf8_bin 中,仅当字符串严格相同时才会发生匹配。这样查询速度更快。
评论
utf8_bin
:通过字符串中每个字符的二进制值来比较字符串。
utf8_general_ci
:使用常规语言规则和不区分大小写的比较来比较字符串。
utf8_general_cs
:使用常规语言规则和区分大小写的比较来比较字符串。
例如,以下命令将使用任一排序规则计算为 true,但不会使用排序规则计算为 true:UTF8_general
utf8_bin
Ä = A
Ö = O
Ü = U
通过排序规则,即使大小写不同,它们也会返回。http://www.phpbuilder.com/board/showpost.php?s=2e642ac7dc5fceca2dbca1e2b9c424fd&p=10820221&postcount=2utf8_general_ci
true
评论
其他答案很好地解释了这些差异。
二进制排序规则在某些情况下很有用:
- 列包含十六进制数据,如密码哈希
- 您只对精确匹配感兴趣,对排序不感兴趣
- 对于只有 [A-Z0-9_] 字符的标识符,您甚至可以使用它进行排序
- 出于某种原因,您将数字存储在 CHAR() 或 VARCHAR 列中(如电话)
- 邮政编码
- UUID
- 等
在所有这些情况下,您都可以使用二进制排序规则节省(少量)CPU 周期。
评论