为何T-SQL中select 1 where '{' < 'a'会返回结果?ASCII值不符预期
T-SQL中
'{' < 'a'返回结果的原因 这事儿的核心原因是T-SQL的字符串比较不依赖单纯的ASCII数值,而是由数据库当前使用的排序规则(Collation)决定。
- 你说的ASCII值没错:
{的ASCII码是123,a是97,纯比数值确实123更大,但字符串比较的逻辑和单纯的数字比较完全不同。 - 比如SQL Server默认的
SQL_Latin1_General_CP1_CI_AS这类排序规则里,字符的排序优先级不是严格按ASCII码排列的。实际这个规则下,{的排序权重低于小写字母a,所以'{' < 'a'会被判定为真,返回结果。 - 而
'b' < 'a'返回空结果,是因为小写字母的排序顺序本身就是a < b < c...,符合常规预期。
你可以用COLLATE关键字强制指定排序规则来验证:
-- 使用二进制排序规则,严格按ASCII数值比较,此时'{'更大,返回空结果 SELECT 1 WHERE '{' < 'a' COLLATE SQL_Latin1_General_CP437_BIN -- 使用默认的不区分大小写排序规则,会返回结果 SELECT 1 WHERE '{' < 'a' COLLATE SQL_Latin1_General_CP1_CI_AS
总结:字符串比较的结果由排序规则主导,要是需要严格按ASCII数值比较,直接用带BIN或BIN2后缀的二进制排序规则就行。
内容的提问来源于stack exchange,提问作者Gurthang99
相关产品推荐
相关产品推荐

