为什么使用unicode进行不同的排序顺序?

时间:2013-08-06 13:11:05

标签: sql-server

我有这个问题:

select ' ' C union
select '*' C union
select '-' C
order by C

结果是spaceasteriskdash,但如果我有这样的unicode字符:

select N' ' C union
select N'*' C union
select N'-' C
order by C

我得到spacedashasterisk。 任何人都可以解释原因吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

我一开始认为这会归结为varcharnvarchar的不同默认排序规则,但似乎并非如此。它似乎通过整理有点变化(我没有看到Latin1_General_CI_AS,但如果我使用SQL_Latin1_General_CP1_CI_AS,我会这样做。

进一步研究,我在Stack Overflow上找到了this answer,它引用了MSDN上的this article,其中有关于连字符和Unicode的说法:

  

SQL排序规则用于排序非Unicode数据的规则与Microsoft Windows操作系统提供的任何排序例程不兼容;但是,Unicode数据的排序与特定版本的Windows排序规则兼容。由于非Unicode和Unicode数据的比较规则不同,因此在使用SQL排序规则时,您可能会看到不同的结果,用于比较相同的字符,具体取决于基础数据类型。例如,如果您使用SQL排序规则“SQL_Latin1_General_CP1_CI_AS”,则非Unicode字符串“ac”小于字符串“ab”,因为连字符(“ - ”)被排序为“b”之前的单独字符。但是,如果将这些字符串转换为Unicode并执行相同的比较,则Unicode字符串N'a-c'被认为大于N'ab',因为Unicode排序规则使用忽略连字符的“单词排序”

所以我将这个答案标记为CW,因为这实际上只是该答案的副本(而问题是该问题的副本)。