为什么Latin1_General_CS_AS不区分大小写?

时间:2014-06-13 16:21:08

标签: sql-server collation

对于LIKE次查询, Latin1_General_CS_AS 排序规则不区分大小写。根据{{​​3}},这被列为" By Design"。

但是, Latin1_General_Bin 排序规则也区分大小写,并且与LIKE查询完全一样。

您可以在这个简单的查询中看到差异:

SELECT
    MyColumn AS Latin1_General_Bin
FROM MyTable
WHERE MyColumn LIKE '%[a-z]%' COLLATE Latin1_General_Bin;

SELECT
    MyColumn AS Latin1_General_CS_AS
FROM MyTable
WHERE MyColumn LIKE '%[a-z]%' COLLATE Latin1_General_CS_AS;

bug report to Microsoft


我的问题是:

  1. 为什么要考虑这个问题" By Design"在LIKE
  2. 中不区分大小写
  3. 如果这确实更好,为什么两个区分大小写的排序规则 _Bin _CS_AS 之间的行为不同?
  4. 我将对 Latin1_General_CS_AS 标准化任何区分大小写的数据库,但这似乎是一个等待发生的微妙查询错误。

1 个答案:

答案 0 :(得分:12)

这不是正则表达式。范围[a-z]仅表示>='a' AND <='z'

在该排序规则下,其中包含除首都Z以外的所有字母。

SQL_Latin1_General_CP1_CS_AS下,除资本A之外的所有内容都属于该排序顺序。


如果仍然不清楚,请查看以下排序顺序;对于三种不同的排序规则

SELECT * 
FROM (VALUES ('A'),('B'),('Y'),('Z'), ('a'),('b'),('y'),('z')) V(C)
ORDER BY C COLLATE Latin1_General_Bin 

您会看到二进制排序规则将所有大写字母组合在一起,而另外两个则没有。

+--------------------+----------------------+-------------------------------+
| Latin1_General_Bin | Latin1_General_CS_AS | SQL_Latin1_General_CP1_CS_AS  |
+--------------------+----------------------+-------------------------------+
| A                  | a                    | A                             |
| B                  | A                    | a                             |
| Y                  | b                    | B                             |
| Z                  | B                    | b                             |
| a                  | y                    | Y                             |
| b                  | Y                    | y                             |
| y                  | z                    | Z                             |
| z                  | Z                    | z                             |
+--------------------+----------------------+-------------------------------+

This is documented in BOL

  

在范围搜索中,范围中包含的字符可能会有所不同   取决于整理的排序规则。