使用 Collat​​ionInfo.Comparer 在 c# 和 SQL 之间实现一致的排序

Posted

技术标签:

【中文标题】使用 Collat​​ionInfo.Comparer 在 c# 和 SQL 之间实现一致的排序【英文标题】:Achieving consistent sorting between c# and SQL using CollationInfo.Comparer 【发布时间】:2012-07-18 17:00:22 【问题描述】:

我正在尝试使用 SMO 的 Collat​​ionInfo.Comparer 来让我的 c# 代码像 SQL Server 一样排序。我得到了正确的排序规则,但我的项目仍然没有正确排序。

var collationInfo = CollationInfo.Collations.Single(x => x.Name == "SQL_Latin1_General_CP1_CS_AS") as CollationInfo;
var comparer = collationInfo.Comparer;

int c = comparer.Compare("Tri-Valley L", "Trimble L");

在这种情况下,c 返回“1”,表示 Tri-Valley L 将出现在 Trimble 之后。

但是这段代码在 SQL Server 中

DECLARE @T TABLE
(
    Name VARCHAR(20)
)

INSERT INTO @T
(
    Name
)
VALUES('Tri-Valley L'),
    ('Trimble L')

SELECT
Name
FROM
@T
ORDER BY Name

在 Trimble 之前返回 Tri-Valley。

排序规则比较的东西是不是不能正常工作,还是我做错了什么?

【问题讨论】:

作为健全性检查,如果您将 SQL 排序更改为 ORDER BY Name COLLATE SQL_Latin1_General_CP1_CS_AS,它是否仍以相同的顺序排序? 它给出了相同的结果。 【参考方案1】:

旧的“SQL”归类排序与 Windows“字排序”算法不一致。您需要对数据库中的列使用 Windows 排序规则(例如 Latin1_General_CS_AS)以获得相同的行为。

【讨论】:

以上是关于使用 Collat​​ionInfo.Comparer 在 c# 和 SQL 之间实现一致的排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 UILocalizedIndexedCollat​​ion sectionForObject:collat​​ionStringSelector 的动态选择器

使用 Collat​​ionInfo.Comparer 在 c# 和 SQL 之间实现一致的排序

c_cpp 使用libgmp进行Collat​​z。

Erlang中的Collat​​z序列

如何将“collat​​e_fn”与数据加载器一起使用?

Collat​​z C++ 代码的问题