使用二进制sorting规则有哪些影响?
在回答这个问题的时候 ,我不确定是否find了足够的答案。
使用二进制utf8_bin
和不区分大小写的utf8_general_ci
sorting规则有什么实际区别?
我可以看到三个:
-
两者都有不同的sorting顺序;
_bin
的sorting顺序可能会把任何变音符号放在字母表的末尾,因为比较字节值(对吧?) -
只在
_bin
区分大小写的search -
没有
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_general
sorting规则评估true,但不使用utf8_bin
sorting规则:
Ä = A
Ö = O
Ü = U
使用utf8_general_ci
sorting规则,即使不是相同的情况,它们也会返回true
。 http://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严格相同的情况下。 查询速度更快。