为什么Latin1_General_CS_AS不区分大小写?

ars*_*in3 10 sql-server collation

对于LIKE查询,Latin1_General_CS_AS排序规则不区分大小写.根据向微软提交错误报告,这被列为"按设计".

但是,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;
Run Code Online (Sandbox Code Playgroud)

SQL小提琴演示.


我的问题是:

  1. 为什么这会被视为"按设计"而不区分大小写LIKE
  2. 如果这真的更好,为什么两个区分大小写的排序_Bin_CS_AS之间的行为不同?

我打算将Latin1_General_CS_AS标准化为任何区分大小写的数据库,但这似乎是一个等待发生的微妙查询错误.

Mar*_*ith 14

这不是一个正则表达式.范围[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 
Run Code Online (Sandbox Code Playgroud)

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

+--------------------+----------------------+-------------------------------+
| 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                             |
+--------------------+----------------------+-------------------------------+
Run Code Online (Sandbox Code Playgroud)

这在BOL中有记录

在范围搜索中,范围中包含的字符可能会根据排序规则的排序规则而有所不同.