You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:38:20