SQL Server中支持大小写与空格敏感的排序规则选型咨询
解决方案:SQL Server 同时支持大小写与空格敏感的排序规则选择
针对你的遗留数据库主键场景(需区分aa/aA/Aa/AA/aa /AA /A A这类值),以下是两种可靠的方案:
1. 字典型排序规则(推荐,符合语言习惯)
选择带有_CS(大小写敏感)、_WS(空格敏感)后缀的UTF8排序规则,最优选项是:Latin_General_100_CS_AS_WS_UTF8
规则后缀说明:
_CS:强制区分大小写(如aa≠AA)_WS:强制区分空格(如aa≠aa,AA≠A A)_AS:区分重音(避免类似á和a被误判为相同,建议保留)_UTF8:支持UTF8编码,适配多语言场景,兼容SQL Server 2019及以上版本
验证示例:
-- 创建测试表并指定目标排序规则 CREATE TABLE TestPK ( PK VARCHAR(10) COLLATE Latin_General_100_CS_AS_WS_UTF8 PRIMARY KEY ); -- 插入所有测试主键值(主键约束会自动验证唯一性) INSERT INTO TestPK VALUES ('aa'), ('aA'), ('Aa'), ('AA'), ('aa '), ('AA '), ('A A'); -- 查询验证所有记录均被正确存储 SELECT PK FROM TestPK ORDER BY PK;
执行后所有7条记录都会成功插入,说明排序规则能正确区分所有差异值。
2. 二进制排序规则(性能优先)
你当前使用的Latin_General_100_BIN2_UTF8本质是基于Unicode码点的二进制比较,理论上应该能区分空格和大小写(空格、小写字母、大写字母的码点均不同)。若你发现它对空格不敏感,大概率是以下原因:
- 列的排序规则未继承表的设置:需检查列的实际排序规则
- 应用层或查询过程中意外去除了空格(如使用
LTRIM/RTRIM) - 隐式排序规则转换导致的比较逻辑变更
检查列排序规则的SQL:
SELECT name, collation_name FROM sys.columns WHERE object_id = OBJECT_ID('你的表名');
若确认列排序规则确实是Latin_General_100_BIN2_UTF8,则它完全满足你的需求;若不满足,排查上述问题后即可正常使用。
方案选择建议
- 若需要符合自然语言的排序逻辑(如
a < b < A < B),优先选择Latin_General_100_CS_AS_WS_UTF8 - 若追求极致性能(二进制比较速度更快),且接受按Unicode码点排序(如空格 < A < a < B < b),则修复
Latin_General_100_BIN2_UTF8的使用问题即可
内容的提问来源于stack exchange,提问作者Tony Valenti
相关产品推荐
相关产品推荐

