相同SQL排序规则下不同服务器查询结果集差异问题咨询
根因分析
出现该问题的核心原因是两台服务器上查询Name列时实际生效的排序规则并不一致,你之前仅核对了实例级、数据库级的排序规则,忽略了其他优先级更高的排序规则配置或底层实现差异,常见触发场景如下:
- 列级排序规则单独配置
数据库级排序规则仅作为新建列的默认值,建表时可显式为单列指定独立的排序规则,后续也可单独修改。多数声称“表结构完全一致”的场景都遗漏了列级排序规则的核对,可执行以下语句查询Name列的实际排序规则:SELECT name, collation_name FROM sys.columns WHERE object_id = OBJECT_ID('Table1') AND name = 'Name'
若两台服务器返回的collation_name不同,即可直接定位问题。 - 同名排序规则的版本实现差异
SQL Server中同一个名称的排序规则,在不同版本的实例、不同兼容级别下底层判断逻辑可能存在调整。你遇到的Grosse(ss拼写)和Große(ß拼写)等价性判断就是典型的调整点:- 旧版本的
SQL_Latin1_General_CP1_CI_AS默认不将ß和ss判定为等价字符,分组时会拆为两行 - 较高版本、或开启了高兼容级别的实例中,
SQL_Latin1_General_CP1_CI_AS会遵循更新的Unicode排序标准,将二者判定为等价,分组时合并为一行
可执行以下语句核对实例版本与数据库兼容级别:
查实例版本:SELECT @@VERSION
查数据库兼容级别:SELECT compatibility_level FROM sys.databases WHERE name = DB_NAME()
- 旧版本的
- 底层Windows系统配置差异
SQL Server的排序规则部分依赖Windows系统的NLS(国家语言支持)库实现,若两台服务器的Windows主版本、安装的语言包、系统区域配置不一致,也会导致同名排序规则的字符判断逻辑存在差异。
解决建议
- 优先统一列级排序规则:直接为Table1的Name列显式指定统一的排序规则(如你测试用的
Latin1_General_CI_AI),可直接覆盖所有上层配置的差异,一劳永逸解决该问题 - 对齐实例与系统配置:若需要全库规则统一,可将两台服务器的SQL Server补丁版本、数据库兼容级别、Windows系统区域配置调整为完全一致,避免其他字段后续出现同类问题
内容的提问来源于stack exchange,提问作者Eliminator
相关产品推荐
相关产品推荐

