SQL_Latin1_General_CP1_CI_AS排序时撇号为何排在其他ASCII字符前
SQL_Latin1_General_CP1_CI_AS 排序不符合ASCII顺序的原因说明
该现象和撇号作为SQL字符串分隔符的语法属性完全无关,本质是SQL_Latin1_General_CP1_CI_AS这类字典排序规则与二进制排序规则的底层逻辑差异导致的。
两类排序规则的逻辑差异
- 二进制排序规则(后缀带
BIN/BIN2,比如你用到的Latin1_General_BIN):排序时直接对比字符的二进制编码值,对于ASCII范围内的单字节字符,排序结果完全与ASCII码值顺序一致,所以能得到你预期的结果。 SQL_Latin1_General_CP1_CI_AS属于面向自然语言的字典排序规则:它的排序逻辑不直接绑定ASCII码值,而是遵循多层级的权重判断规则:先判断字符的主要权重(基础字符差异),再判断次要权重(重音差异)、第三级权重(大小写差异),最后才判断特殊符号的权重。特殊符号的排序优先级是按照拉丁语言的日常使用习惯预设的,和ASCII码值没有必然的对应关系。
撇号的排序权重设计
在SQL_Latin1_General_CP1_CI_AS对应的拉丁字典排序规则中,撇号(')被赋予了更高的排序优先级:因为撇号大量出现在英语等拉丁语言的缩写(如don't)、名词所有格(如Jack's)场景中,规则设计时特意将它的排序优先级提到了双引号、美元符号、百分号等符号之前,所以即便它的ASCII码值(39)大于双引号的34、美元符号的36,排序时仍然会出现在这些符号的前面。
内容的提问来源于stack exchange,提问作者Doua
相关产品推荐
相关产品推荐

