有人可以解释一下:
SELECT
CASE WHEN CAST('iX' AS nvarchar(20))
> CAST('-X' AS nvarchar(20)) THEN 1 ELSE 0 END,
CASE WHEN CAST('iX' AS varchar(20))
> CAST('-X' AS varchar(20)) THEN 1 ELSE 0 END
结果: 0 1
SELECT
CASE WHEN CAST('i' AS nvarchar(20))
> CAST('-' AS nvarchar(20)) THEN 1 ELSE 0 END,
CASE WHEN CAST('i' AS varchar(20))
> CAST('-' AS varchar(20)) THEN 1 ELSE 0 END
结果: 1 1
在第一个查询中,nvarchar()
结果不是我所期望的,但删除X
会使nvarchar()
排序按预期发生。
(我的原始查询使用''
和N''
字面语法来区分varchar()
和nvarchar()
而不是CAST()
并获得相同的结果。)< / p>
数据库的整理设置为SQL_Latin1_General_CP1_CI_AS
。
答案 0 :(得分:9)
比较unicode文本时,会特别处理连字符。 Unicode比较使用“字典顺序”,忽略连字符。非unicode文本比较不是这种情况。
比较-X
和iX
,就像比较X
和iX
一样,左侧的-X
更大。
当比较“ - ”和“i”时,就像比较“”和“i”,所以“i”,右侧更大。
来自MSDN,
SQL排序规则的排序规则 非Unicode数据与。不兼容 由...提供的任何排序例程 Microsoft Windows操作系统 系统;然而,排序 Unicode数据与a兼容 特定版本的Windows 排序规则。因为比较 非Unicode和Unicode数据的规则 当你使用SQL时,它们是不同的 整理你可能会看到不同 比较结果 字符,取决于 基础数据类型。例如,如果 您正在使用SQL排序规则 “SQL_Latin1_General_CP1_CI_AS”,. 非Unicode字符串'a-c'小于 字符串'ab',因为连字符 (“ - ”)作为单独的分类 在“b”之前出现的字符。 但是,如果您转换这些字符串 到Unicode并执行相同的操作 比较,Unicode字符串N'a-c' 被认为大于N'ab' 因为Unicode排序规则使用 忽略连字符的“单词排序”。
SELCT body From MSDN_Articles WHERE url IN
(“http://support.microsoft.com/kb/322112”)
答案 1 :(得分:1)