寻找Microsoft SQL Server中ASCII不区分大小写的排序规则
问题解答
核心结论
SQL Server中没有原生的、完全匹配你需求的排序规则——即严格按照ASCII值排序且大小写字符紧邻排列(如A后紧跟a)的不区分大小写规则。
原因说明
你期望的排序逻辑是按字符小写后的ASCII值排序,同时保留大小写字符的紧邻关系。而SQL Server现有排序规则的特性无法同时满足这两点:
- 常规不区分大小写排序规则(如
SQL_Latin1_General_CP1_CI_AS):这类规则会将大小写字符视为完全相等,排序时会把所有大写字符或小写字符集中排列,无法实现AaBbCc...的紧邻效果。 - 二进制排序规则(如
SQL_Latin1_General_CP850_BIN):这类规则严格按字符的二进制编码排序,但会区分大小写(A和a的ASCII值不同),不符合你不区分大小写的要求。
可行替代方案
1. 你当前使用的方法(推荐)
你实现的ORDER BY ASCII(LOWER(char_test))是最直接匹配需求的方式,逻辑清晰,在数据量不大时性能足够:
SELECT char_test FROM code_page_test ORDER BY ASCII(LOWER(char_test))
如果数据量较大,可通过添加计算列并建立索引优化排序性能:
-- 添加存储小写字符的计算列 ALTER TABLE code_page_test ADD lower_char_test AS LOWER(char_test); -- 为计算列创建索引 CREATE INDEX idx_lower_char_test ON code_page_test(lower_char_test); -- 基于计算列排序,提升查询效率 SELECT char_test FROM code_page_test ORDER BY lower_char_test;
2. 自定义排序规则(复杂方案)
若必须通过排序规则实现,可利用SQL Server 2017及以上版本的自定义排序规则功能,基于二进制排序规则修改权重映射,将大小写字符设为相同权重。但该步骤需熟悉排序规则的权重配置逻辑,操作复杂,仅适用于有特殊场景需求的情况。
内容的提问来源于stack exchange,提问作者sd.
相关产品推荐
相关产品推荐

