1

我有这个查询:

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

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

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

我得到space, dash, asterisk. 谁能解释为什么?

谢谢!

4

1 回答 1

3

起初我认为这将取决于 and 的不同默认排序规则varcharnvarchar但似乎并非如此。它似乎确实因排序规则而有所不同(我没有看到它,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,因为这实际上只是该答案的副本(并且问题是该问题的副本)。

于 2013-08-06T13:14:16.520 回答