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

时间:2011-04-02 22:32:09

标签: mysql collation

在回答this question时,我对某些我无法找到足够答案的事情感到不确定。

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

我可以看到三个:

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

  2. _bin

  3. 中区分大小写的搜索
  4. A = Ä

  5. 中没有_bin次平等

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

    参考:

    未解决此问题的类似问题:

4 个答案:

答案 0 :(得分:50)

二进制排序规则将您的字符串与C中的strcmp()进行比较,如果字符不同(无论是大小写还是变音符号差异)。它的缺点是排序顺序不自然。

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

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

答案 1 :(得分:12)

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

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

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

例如,以下内容将使用UTF8_general排序规则评估为true,但不会使用utf8_bin排序规则进行评估:

Ä = A Ö = O Ü = U

使用utf8_general_ci归类,即使不是相同的情况,它们也会返回truehttp://www.phpbuilder.com/board/showpost.php?s=2e642ac7dc5fceca2dbca1e2b9c424fd&p=10820221&postcount=2

答案 2 :(得分:1)

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

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

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

在所有这些情况下,您可以使用二进制排序规则保存(一点点)cpu周期。

答案 3 :(得分:0)

使用 utf8_general_ci ,匹配会在不考虑大小写和重音的情况下发生。当你需要对单词进行查询时,这可能是一件好事。

utf8_bin 中,匹配仅在字符串严格相同时发生。查询速度更快。