为什么SQL Server对字符串列进行排序时不考虑字符串长度

时间:2018-01-15 18:33:25

标签: sql-server string sorting

我在SQL Fiddle for this question处有一个简单的SQL小提琴。

问题

我不理解非常基本的东西,即当按升序排序字符串值时,为什么SQL Server会在-sock之前放置abcx

如果有人可以解释数据库引擎所遵循的幕后逻辑,那么这将非常清楚。

我认为较小的长度字符串总是在较长的字符串之前。因此,首先对所有长度为1的字符串进行排序,然后是长度为2的字符串,后跟长度为3的字符串,依此类推。

此问题的脚本如下所示。

abd

2 个答案:

答案 0 :(得分:2)

我相信你在这里真正讨论的是SQL Server整理 - 看一下这篇MS文章 - 它适用于SQL 2008,但是对于这一点来说一样好:

Selecting a SQL Server Collation

答案 1 :(得分:2)

在SQL Server中对(n)varchar进行排序时,位置中的每个字符都会与相同位置中的字符进行排序。如果(n)varchar比另一个短,但其第一个字符在字母表后面是另一个值,那么该值将在排序的后面出现。

因此,例如,简单值A很可能出现在排序顺序的开头。同样地,zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA将出现在结尾附近,因为它的第一个字符是z。

abdabcx的示例中,首先(n)varchar按其第一个字符a排序,然后按第二个字符b排序。这些都是一样的。但是,第三个字符是cd。字母表中的c位于字母d之前,因此ascending排序顺序abcx将在abd之前排序;因为第3个字符在字母表中较早,并且是第一个不同的字符。

编辑:此外,再添加一点。如果(n)varchar比另一个(n)varchar短但共享相同的初始字符,则它也会提前排序。因此,例如,值add将在单词addition之前排序。