在回答这个问题的时候,我对一些我没能找到充分答案的事情感到不确定。
使用二进制之间的实际区别是什么 utf8_bin
不区分大小写 utf8_general_ci
排序规则?
我可以看到三个:
两者的排序顺序不同; _bin
的排序顺序可能会将所有元音放在字母表的末尾,因为字节值是比较的(对吗?)
中仅区分大小写的搜索 _bin
不 A = Ä
平等 _bin
还有其他的区别或副作用需要注意吗?
参考文献:
9.1.2. mysql中的字符集和排序规则
9.1.7.6. mysql手册中的\u bin和二进制排序规则
9.1.7.7. 二元运算符
类似的问题没有解决这个问题:
utf-8:通用?箱子?unicode?
4条答案
按热度按时间iklwldmw1#
其他答案很好地解释了这些差异。
二进制排序规则在某些情况下很有用:
列包含十六进制数据,如密码哈希
你只对精确匹配感兴趣,而不是排序
对于只有[a-z0-9]个字符的标识符,您甚至可以使用它进行排序
由于某些原因,您将数字存储在char()或varchar列中(如电话)
邮政编码
UUID公司
等
在所有这些情况下,使用二进制排序规则可以节省(一点)cpu周期。
yks3o0rb2#
utf8_bin
:按字符串中每个字符的二进制值比较字符串。utf8_general_ci
:使用通用语言规则和不区分大小写的比较来比较字符串。utf8_general_cs
:使用常规语言规则和区分大小写的比较来比较字符串。例如,下面的表达式将使用
UTF8_general
排序规则,但不能与utf8_bin
排序规则:Ä = A
Ö = OÜ = U
与utf8_general_ci
整理,他们也会回来true
即使不是同样的情况。http://www.phpbuilder.com/board/showpost.php?s=2e642ac7dc5fceca2dbca1e2b9c424fd&p=10820221&postcount=2hwazgwia3#
二进制排序规则将字符串与
strcmp()
在c语言中,如果字符不同(无论是大小写还是音调符号的不同)就可以了。它的缺点是排序顺序不自然。非自然排序顺序的示例(如“二进制”中的排序顺序):
A,B,a,b
在这种情况下,自然排序顺序是,例如:A,a,B,b
(同一个字母的小写和大写字母排列在一起)二进制排序的实际优势在于它的速度,因为字符串比较非常简单/快速。一般情况下,带有二进制的索引可能不会产生预期的排序结果,但是对于精确匹配,它们可能很有用。
ttcibm8c4#
使用utf8\u general\u ci时,匹配不考虑大小写和重音。当您需要对单词执行查询时,这可能是一件好事。
在utf8\u bin中,仅当字符串完全相同时才发生匹配。这样查询速度更快。