Sql server 为什么拉丁语1_General_CS_不区分大小写?
对于像这样的Sql server 为什么拉丁语1_General_CS_不区分大小写?,sql-server,collation,Sql Server,Collation,对于像这样的查询,Latin1_General_CS_AS排序规则不区分大小写。根据a,这被列为“按设计” 但是,Latin1_General_Bin排序规则也是区分大小写的,并且与类似的查询完全一样 您可以在这个简单的查询中看到差异: SELECT MyColumn AS Latin1_General_Bin FROM MyTable WHERE MyColumn LIKE '%[a-z]%' COLLATE Latin1_General_Bin; SELECT MyColu
查询,Latin1_General_CS_AS排序规则不区分大小写。根据a,这被列为“按设计”
但是,Latin1_General_Bin排序规则也是区分大小写的,并且与类似的查询完全一样
您可以在这个简单的查询中看到差异:
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;
我的问题是:
为什么像
这样的中,“按设计”将其视为不区分大小写
如果这真的更好,为什么这两个区分大小写的排序规则_Bin和_CS_AS的行为不同
我本来打算在拉丁语1_General_CS_上对任何区分大小写的数据库进行标准化,但这似乎是一个微妙的查询错误等待发生。它不是一个正则表达式。范围[a-z]
仅表示='a',我不确定这是否意味着拉丁语1_General_CS_AS
不区分大小写。使用“%[abcdefghijklmnopqrstuvwxyz]”之类的更改查询,并将拉丁文1\u General\u CS\u作为对照代码>似乎有效。问题似乎在于%[a-z]
选择characters@lamak和这个原因一样。它是有文件记录和设计的。范围与排序规则排序顺序匹配。你可以想象它在一个索引中搜索,该索引的键列位于范围的开始处,并跟随索引一直到范围的结束,返回途中找到的所有内容。这似乎是一个范围“问题”。。。如果您使用如“%e%”
或如“e”
(在错误报告中建议),您将得到明确的结果(否),但如“%[d-f]”
返回错误的结果(是)@MartinSmith感谢链接。我从连接项中猜到了类似的东西。谢谢,这有助于澄清为什么它会这样。但为什么这是可取的?这意味着在区分大小写的排序规则中,单词“zzz”<“Zaaaa”。然而,这似乎与其他所有基于ASCII的语言/比较器背道而驰。那么,为什么这是可取的呢?@arserbin3-这似乎是一个不同的问题!从模式语法中范围的角度来看,可以使用任意字符作为开始或结束的任意范围,一旦理解了逻辑,它就有了某种意义。至于在CS排序中,“zzz”在“Zaaaa”之前排序是否有意义。这不是我想的,但如果你不想出现这种排序行为,为什么不在那里使用CI排序规则呢?@MartinSmith谢谢!这真的节省了我的时间,治愈了我的沮丧。干得好!
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 |
+--------------------+----------------------+-------------------------------+