ric*_*ent 5 t-sql unicode nvarchar sql-server-2005 collation
有人可以解释一下:
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
Run Code Online (Sandbox Code Playgroud)
结果: 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
Run Code Online (Sandbox Code Playgroud)
结果: 1 1
在第一个查询中,nvarchar()结果不是我所期望的,但是删除Xmake会使nvarchar()排序按预期发生.
(我原来的查询中使用的''和N''文字语法来区分varchar()和nvarchar(),而不是CAST(),得到了相同的结果.)
数据库的排序规则设置为SQL_Latin1_General_CP1_CI_AS.
比较unicode文本时,特殊处理连字符.Unicode比较使用"字典顺序",忽略连字符.非unicode文本比较不是这种情况.
比较-X和iX,是比较喜欢X和iX,所以-X,左侧较大.当比较" - "和"i"时,就像比较""和"i",所以"i",右侧更大.
来自MSDN,
SQL排序规则用于排序非Unicode数据的规则与Microsoft Windows操作系统提供的任何排序例程不兼容; 但是,Unicode数据的排序与特定版本的Windows排序规则兼容.由于非Unicode和Unicode数据的比较规则不同,因此在使用SQL排序规则时,您可能会看到不同的结果,用于比较相同的字符,具体取决于基础数据类型.例如,如果您使用SQL排序规则"SQL_Latin1_General_CP1_CI_AS",则非Unicode字符串"ac"小于字符串"ab",因为连字符(" - ")被排序为"b"之前的单独字符.然而,
SELCT body From MSDN_Articles WHERE url IN(" http://support.microsoft.com/kb/322112 ")