【问题标题】:VARCHAR collation versus VARBINARY ordering in SQL Server 2000SQL Server 2000 中的 VARCHAR 排序规则与 VARBINARY 排序
【发布时间】:2010-10-24 14:01:10
【问题描述】:

我需要在 C# 中将来自一个或多个 SQL Server 2000 数据库的两个排序的字符串流在内存中合并到一个排序的流中。这些数据流可能很大,所以我不想将两个流都拉到内存中。相反,我需要在内存中的每个流中一次保留一个项目,并且在每个步骤中,比较每个流中的当前项目,将最小值推送到最终流中,然后从适当的源流中提取下一个项目。但是,要正确执行此操作,内存中的比较必须与数据库的排序规则相匹配(考虑流[A,B,C][A,B,C]:正确的合并序列是[A,A,B,B,C,C],但如果您的内存中比较认为@ 987654324@,您的内存合并将产生A,A,B,此时它将查看BC,并将产生C,从而导致流排序错误。)

所以,我的问题是:有没有办法在 C# 中使用 System.StringComparison 枚举来模仿 SQL Server 2000 中的任何排序规则,反之亦然?我最接近的方法是使用System.StringCompaison.Ordinal 将数据库字符串的结果转换为VARBINARY 并使用标准VARBINARY 排序,这是可行的,但我宁愿只在我的SQL 中添加一个"order by name collate X" 子句查询,其中 X 是某种排序规则,其工作方式与 VARBINARY 排序完全相同,而不是将所有字符串在离开数据库时转换为 VARBINARY,然后在进入内存时再转换回字符串。

【问题讨论】:

    标签: c# sql-server string collation


    【解决方案1】:

    使用 sql 2005,我知道 db 引擎不会调用 OS 来进行排序,排序规则是静态附带的 db(可能会随服务包更新,但不会随操作系统而改变)。所以我不认为你可以肯定地说,除非你有与数据库服务器相同的代码,除非你使用二进制排序规则,否则一组给定的应用程序代码可以以相同的方式排序。

    但如果您在数据库和客户端代码中使用二进制排序规则,您应该完全没有问题。

    编辑 - 任何以 _BIN 结尾的排序规则都会为您提供二进制排序。排序规则名称的其余部分将确定用于存储 CHAR 数据的代码页,但不会影响排序。 _BIN 表示严格的二进制排序。见http://msdn.microsoft.com/en-us/library/ms143515(SQL.90).aspx

    【讨论】:

    • 您确定 _BIN 适用于 SQL Server 2000 吗?
    • 我尝试了几种 BIN 排序,包括 Latin1_General_BIN 和 Latin1_General_BIN2,但它们与 StringComparison.Ordinal 不同。我的测试用例包括生成一定长度的所有字节字符串,使用 System.Text.Encoding.Unicode.GetString 将它们转换为字符串,使用 StringComparison.Ordinal 对它们进行排序,并使用“order”将结果与数据库中的结果进行比较通过整理 X"。 _BIN 或 _BIN2 排序中没有一个与内存中的排序顺序匹配。
    • @larry - 你是如何在数据库中生成字符串的?就像 cast(0x..... as nvarchar(N)) 一样?
    • 我使用 System.Data.SqlClient 从 C# 将字符串插入到表中,直接来自我生成并针对 StringComparison.Ordinal 进行测试的排序列表。
    • @Larry - 您能否确认您使用的是 Nchar/Nvarchar 而不是 char/varchar?也许您应该使用 StringComparison.OrdinalIgnoreCase?
    【解决方案2】:

    看看StringComparer 类。这提供了比String.Compare 更强大的字符和字符串比较。有三组静态实例(CurrentCultureInvariantCultureOrdinal)和每组的不区分大小写的版本。对于更专业的文化,您可以使用 StringComparer.Create() 函数创建与特定文化相关的比较器。

    【讨论】:

      猜你喜欢
      • 2020-05-28
      • 2011-02-11
      • 2011-05-05
      • 2011-06-04
      • 2012-06-08
      • 2010-10-07
      • 2020-12-16
      • 2012-01-21
      • 2014-08-15
      相关资源
      最近更新 更多