使用二进制sorting规则有哪些影响?

在回答这个问题的时候 ,我不确定是否find了足够的答案。

使用二进制utf8_bin和不区分大小写的utf8_general_cisorting规则有什么实际区别?

我可以看到三个:

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

  2. 只在_bin区分大小写的search

  3. 没有A = Ä平等_bin

是否还有其他的区别或副作用需要注意?

参考:

  • 9.1.2。 MySQL中的字符集和sorting规则
  • 9.1.7.6。 mySQL手册中的_bin和二进制sorting规则
  • 9.1.7.7。 BINARY运算符

类似的问题没有解决这个问题:

  • UTF-8:一般? 滨? Unicode的?

二进制sorting比较你的string完全一样,因为strcmp()在C会做,如果字符不同(是只是大小写或区别)。 它的缺点是sorting顺序不自然。

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

二进制整理的实际优点是速度,因为string比较非常简单/快速。 在一般情况下,使用二进制的索引可能不会产生预期的sorting结果,但是对于精确匹配,它们可能是有用的。

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

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

utf8_general_cs :使用通用语言规则比较string,并使用区分大小写的比较。

例如,以下将使用UTF8_generalsorting规则评估true,但不使用utf8_binsorting规则:

Ä = A Ö = O Ü = U

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

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

二进制sorting在某些情况下可能会有用:

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

在所有这些情况下,您可以使用二进制sorting规则保存(less许)cpu周期。

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

utf8_bin中 ,匹配只发生在string严格相同的情况下。 查询速度更快。