【问题标题】:Weird SQL Server 2005 Collation difference between varchar() and nvarchar()varchar() 和 nvarchar() 之间奇怪的 SQL Server 2005 排序规则差异
【发布时间】:2011-03-04 16:09:00
【问题描述】:

谁能解释一下:

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() 并得到相同的结果。)

数据库的排序规则设置为SQL_Latin1_General_CP1_CI_AS

【问题讨论】:

  • 快速跟进:在我的情况下,“-”仅用作某些复杂文本的排序代码的填充字符。我把它换成了“!”现在可以正常使用了。

标签: sql-server-2005 tsql unicode collation nvarchar


【解决方案1】:

在比较 unicode 文本时,会特别处理连字符。 Unicode 比较使用“字典顺序”,它忽略连字符。非 unicode 文本比较不是这种情况。

比较-XiX,就像比较XiX,所以左侧的-X 更大。 比较“-”和“i”时,就像比较“”和“i”一样,所以“i”,右边更大。

来自 MSDN,

SQL 排序规则的排序规则 非 Unicode 数据不兼容 提供的任何排序例程 微软视窗操作系统 系统;然而,排序 Unicode 数据与 特定版本的 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")

【讨论】:

    【解决方案2】:

    一个很好的问题!

    四处挖掘,我发现问题与连字符和撇号有关。您的示例使用 '''X' 表现出与使用 '-X' 相同的“奇怪”行为。

    我不能把找到答案的功劳归功于它,因为它就在这里: SQL Sorting and hyphens

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-22
      • 2010-09-05
      • 1970-01-01
      • 2010-10-25
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      相关资源
      最近更新 更多