使用 CollationInfo.Comparer 在 c# 和 SQL 之间实现一致的排序
Posted
技术标签:
【中文标题】使用 CollationInfo.Comparer 在 c# 和 SQL 之间实现一致的排序【英文标题】:Achieving consistent sorting between c# and SQL using CollationInfo.Comparer 【发布时间】:2012-07-18 17:00:22 【问题描述】:我正在尝试使用 SMO 的 CollationInfo.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)以获得相同的行为。
【讨论】:
以上是关于使用 CollationInfo.Comparer 在 c# 和 SQL 之间实现一致的排序的主要内容,如果未能解决你的问题,请参考以下文章
使用 UILocalizedIndexedCollation sectionForObject:collationStringSelector 的动态选择器