我有这个问题:
select ' ' C union
select '*' C union
select '-' C
order by C
结果是space
,asterisk
和dash
,但如果我有这样的unicode字符:
select N' ' C union
select N'*' C union
select N'-' C
order by C
我得到space
,dash
,asterisk
。
任何人都可以解释原因吗?
谢谢!
答案 0 :(得分:3)
我一开始认为这会归结为varchar
和nvarchar
的不同默认排序规则,但似乎并非如此。它似乎通过整理有点变化(我没有看到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,因为这实际上只是该答案的副本(而问题是该问题的副本)。