我有这个查询:
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
. 谁能解释为什么?
谢谢!
我有这个查询:
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
. 谁能解释为什么?
谢谢!
起初我认为这将取决于 and 的不同默认排序规则varchar
,nvarchar
但似乎并非如此。它似乎确实因排序规则而有所不同(我没有看到它,Latin1_General_CI_AS
但如果我使用它我会看到SQL_Latin1_General_CP1_CI_AS
)。
进一步研究,我在 Stack Overflow 上找到了这个答案,它引用了 MSDN 上的这篇文章,其中有关于连字符和 Unicode 的说明:
SQL 排序规则用于对非 Unicode 数据进行排序的规则与 Microsoft Windows 操作系统提供的任何排序例程都不兼容;但是,Unicode 数据的排序与特定版本的 Windows 排序规则兼容。由于非 Unicode 和 Unicode 数据的比较规则不同,因此当您使用 SQL 排序规则时,您可能会看到相同字符的比较结果不同,具体取决于基础数据类型。例如,如果您使用 SQL 排序规则“SQL_Latin1_General_CP1_CI_AS”,则非 Unicode 字符串“ac”小于字符串“ab”,因为连字符 (“-”) 被排序为位于“b”之前的单独字符. 但是,如果将这些字符串转换为 Unicode 并执行相同的比较,则 Unicode 字符串 N'
因此,我将此答案标记为 CW,因为这实际上只是该答案的副本(并且问题是该问题的副本)。