数据库的排序方式默认

哎呦,说起来这数据库的排序,还真是挺有意思的。
就拿MySQL来说吧,它这个默认排序,跟字符集和排序规则可是紧密相连。
比如说,咱们常见的utf8 mb4 字符集,默认的排序规则是utf8 mb4 _09 00_ai_ci。
这“ai”啊,意思就是不管字母带不带重音,都不影响排序;这“ci”啊,就是不管大小写,也都不影响。
所以在MySQL里,排序的时候,大小写字母还有带不带重音的字符,都跟普通字符一样对待,不会有什么区别。

那SQLServer呢,它的默认排序规则啊,跟安装时的区域设置有关系。
比如说,中文环境的默认排序规则可能是Chinese_PRC_CI_AS。
这里的“CI”是说不区分大小写,“AS”是说不区分重音。
所以呢,中文排序啊,就会按照拼音来。

再说说Oracle,这个数据库的默认排序啊,跟字符集和NLS_SORT参数有关。
如果没有特别设置,它会按照字符集的二进制编码顺序来排序。
但是,如果你愿意,也可以通过修改NLS_SORT参数来改变排序方式,比如设置为按字母顺序、字典顺序等等。

总的来说,数据库的默认排序是为了满足大多数场景下的排序需求。
不过嘛,这东西都是可以根据具体业务需求来调整的,用户可以根据自己的需要来修改排序规则,达到不同的排序效果。
当时我在做项目的时候,就因为没弄明白这个排序规则,结果出了点小差错,真是尴尬啊。
不过现在回想起来,这也算是个经验教训吧。

mysql ordery by 默认是如何进行排序的呢?

说白了,MySQL的ORDER BY默认升序是基本操作,但踩坑点不少。

先说最重要的,单字段排序时,比如去年我们跑那个电商项目,用SELECT FROM orders ORDER BY price,默认按价格升序,结果一堆便宜商品排在前面,用户直喊"屠夫啊"。
另外一点,多字段时得玩命注意顺序,我们有个报表需求,ORDER BY user_id, created_at,发现用户ID相同的情况下,居然按注册时间倒序排了——因为没显式写created_at的ASC。
还有个细节挺关键的,比如3 000量级数据,你用ORDER BY RAND(),CPU直接干烧,用行话说叫雪崩效应,其实就是前面一个小延迟把后面全拖垮了。

我一开始也以为InnoDB默认啥都按主键排,后来发现不对,测试了主键随机插入的数据,结果居然按插入时间排的。
等等,还有个事,MyISAM的排序依赖插入顺序,但现在已经不怎么用了,不过还是得知道。

建议显式写ASC或DESC,别让MySQL猜你的意图。

深究 mysql 默认排序, order by 的顺序【收藏】

上周,我帮朋友调试一个MySQL查询,发现了一个小问题。
他写了个查询语句,没加ORDER BY,结果数据顺序乱七八糟的。
我一开始以为是他理解错了,后来查了资料,发现MySQL默认没有排序顺序。
就算表有主键或聚集索引,也不保证按索引顺序返回。
他那个朋友挺纳闷的,说数据插入时是按顺序的,怎么查出来就不一样了。
我解释了,说是因为数据库检索数据时可能为了效率,不一定按插入顺序。
他听后说,那以后查询时得记得加上ORDER BY,不然数据顺序乱,业务逻辑就出问题了。
我让他试试,他点头说,你看着办吧。