Mysql的排序集的pad space和no pad
3.排序集:
接下来我们看现象:
首先表结
说这个知识点之前,先看下我发现这个问题的环境:mysql8.0字符集(建议大家用utf8mb4mysql排序,否则你会遇到表情的坑,比如微信名带表情的): 3.排序集: 接下来我们看现象: 首先表结构是这样的:
接下来,我们插入一条sql:
然后我们接下来通过一条查询语句看下输入结果: 当让这是意料之中的。 接下来我们用另一个查询语句,看看结果是什么 细心的小伙伴不知道发现了没?我们在name的后面的查询值多加了个几个空格(空格数量不限),你会发现它竟然也会查出来(当时业务上出了这个坑,哎,都以为是代码问题) 解释一下: 为什么会发生这个问题,这个就是mysql的排序集的pad space和no pad导致的。先看看官网怎么解释的: For nonbinary strings (CHAR, VARCHAR, and TEXT values), the string collation pad attribute determines treatment in comparisons of trailing spaces at the end of strings: For PAD SPACE collations, trailing spaces are insignificant in comparisons; strings are compared without regard to trailing spaces. NO PAD collations treat trailing spaces as significant in comparisons, like any other character. 10.8.5 The binary Collation Compared to _bin Collations 大概意思就是说对于 PAD SPACE 排序规则,尾随空格在比较中无关紧要;比较字符串时不考虑尾随空格,而对于NO PAD就需要考虑空格 然后我们看看怎么知道自己的排序集是NO PAD呢?还是PAD SPACE?
使用上面的语句就可以查出来,结果如下 我测试用的数据库默认的排序集是 果然是PAD SPACE,所以才导致上面的现象。。 接下来我们改下这个表的排序集,变成NO PAD的utf8mb4_0900_ai_ci:
最终的表结构输入结果:(这里发现了一个有趣点,mysql帮你把字符集都改了) 接下来重复上面的查询: 哈哈,你会发现现在查不出来了。 总结 1. 排序集为PAD SPACE可以忽略查询值的空格,NO PAD不会忽略。 2.大家建表的时候一定要关注字符集和排序集,否则就是留坑 (编辑:海南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |