MSSQL中字符ORDER BY工作原理及与MySQL排序差异疑问
ORDER BY 字符排序逻辑的核心差异原因
ORDER BY 本身不内置固定的字符排序优先级规则,所有字符/字符串的先后顺序完全由**排序规则(Collation)**决定,和数据库类型没有绝对绑定关系。
两种排序结果的本质区别
- 你期望的 AaBbCcDd 效果:属于「同字母分组,组内大写优先」的排序,对应大小写敏感类排序规则(后缀带
CS或bin的规则)。这类规则会先按字符的基础字母维度排序,同字母下再对比大小写优先级。 - 你实际得到的 AabBCcdD 效果:结合你提供的示例场景,本质是大小写不敏感类排序规则(后缀带
CI的规则)的表现。这类规则默认不区分大小写的基础属性,仅对比排序权重:- 先按基础字母的统一小写(或大写)形式匹配排序层级,短字符串优先于同前缀的长字符串
- 同权重下大写字母的排序优先级高于小写字母,拆分后就会出现你看到的排序结果
不同数据库的默认规则差异
- 《SQL Heads Down》的示例基于 MySQL 编写,旧版本 MySQL 默认使用
latin1_swedish_ci这类排序规则,排序权重和 MSSQL 默认的 CI 规则不同,刚好能输出 AaBbCcDd 的效果。 - MSSQL 简体中文环境默认使用
Chinese_PRC_CI_AS排序规则,排序权重逻辑和 MySQL 默认规则有差异,自然会输出不同的结果。
调整排序效果的方法
如果需要得到同字母分组、大写在前的排序效果,可以直接在 ORDER BY 子句手动指定规则:
- 强制使用大小写敏感的排序规则:
-- MSSQL 示例 ORDER BY 目标列 COLLATE Chinese_PRC_CS_AS - 手动调整排序层级,兼容所有排序规则:
-- 先按字符的统一大小写形式分组,再按原字符排序 ORDER BY LOWER(目标列), 目标列
内容的提问来源于stack exchange,提问作者Will123
相关产品推荐
相关产品推荐

