Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么拉丁语1_General_CS_不区分大小写?_Sql Server_Collation - Fatal编程技术网

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                             |
    +--------------------+----------------------+-------------------------------+