为何Azure SQL认为下划线处于空格与'ZZZZZ'的排序区间内
Azure SQL下划线范围查询返回结果的成因说明
这个现象不是Azure SQL的缺陷,核心差异来源于排序规则(Collation)的字符比较逻辑设置,具体原因如下:
- 字符串比较的判断规则完全由当前会话/字段/数据库生效的排序规则决定,不同排序规则对特殊字符的排序权重、大小写/重音敏感策略、符号优先级的定义存在明显差异:
- 常规本地SQL Server默认使用旧版SQL排序规则、Oracle默认使用基于二进制码值的排序规则,会严格按照ASCII码值做比较:下划线
_的ASCII码为95,大写字母Z的ASCII码为90,因此'_' > 'Z',自然不满足BETWEEN ' ' AND 'ZZZZZZZ'的条件,不会返回任何结果。 - Azure SQL默认采用新版Windows排序规则(如
Latin1_General_100_CI_AS),这类排序规则是按照自然语言使用习惯设计排序优先级,下划线这类非字母符号的排序优先级排在所有英文字母之前,因此此时'_' < 'Z',满足范围查询条件,就会返回结果。
- 常规本地SQL Server默认使用旧版SQL排序规则、Oracle默认使用基于二进制码值的排序规则,会严格按照ASCII码值做比较:下划线
- 你可以通过以下操作验证逻辑、对齐其他数据库的执行结果:
- 执行以下语句查看当前数据库的生效排序规则:
SELECT name, collation_name FROM sys.databases WHERE name = DB_NAME(); - 如果需要和本地SQL Server/Oracle的执行结果对齐,可在查询时强制指定二进制排序规则即可得到无返回的结果:
SELECT * FROM table WHERE '_' COLLATE Latin1_General_BIN BETWEEN ' ' AND 'ZZZZZZZ'
- 执行以下语句查看当前数据库的生效排序规则:
内容的提问来源于stack exchange,提问作者A_M_2020
相关产品推荐
相关产品推荐

