SQL Server用户名排序不符预期,如何调整排序规则?
解决SQL Server与C#/其他数据库用户名排序不一致的问题
问题原因
你使用的SQL_Latin1_General_CP1_CI_AS属于SQL兼容排序规则,采用旧版排序逻辑,对.、_这类符号的权重定义和Unicode标准排序算法不同。而C# LINQ、PostgreSQL/MySQL默认遵循Unicode标准排序逻辑,因此出现排序结果差异。
你之前尝试的Latin1%CI%AI%类排序规则仅控制是否忽略重音(AI=重音不敏感),不影响符号的排序权重,因此无法解决问题。
解决方案
要让SQL Server的排序结果与C#/其他数据库一致,需改用基于Windows Unicode排序算法的规则,推荐使用Latin1_General_100_CI_AS(SQL Server 2008及以上支持的新版规则,更贴合Unicode标准)。
1. 临时查询指定排序规则
无需修改表结构,可在ORDER BY子句中临时指定规则:
SELECT [Username] FROM [dbo].[Test] ORDER BY Username COLLATE Latin1_General_100_CI_AS;
2. 永久修改字段排序规则
如果希望该字段默认排序始终符合预期,可修改表字段的排序规则:
ALTER TABLE [dbo].[Test] ALTER COLUMN [Username] NVARCHAR(256) COLLATE Latin1_General_100_CI_AS NOT NULL;
验证
执行上述操作后,test_test会排在test.test之前,与C# LINQ的排序结果完全一致。
内容的提问来源于stack exchange,提问作者Knalltuete5000
相关产品推荐
相关产品推荐

