SQL Server Standard 64位,带有归类SQL_Latin1_General_CP1_CS_AS
表plz
:
ort varchar(30) SQL_Latin1_General_CP1_CS_AS
select ort,
from plz
where
ort >= 'zürich'
and ort <= 'zürichz'
选择此数据:
Zürich
Zürich Mülligen
Zürich 80
如果没有第二个zürich末尾的z
,则不会选择任何数据。但为什么它会在区分大小写的服务器上显示数据?
答案 0 :(得分:2)
比较字符串时,SQL Server所做的第一件事就是用空格填充较短的字符串,以便字符串具有相同的长度。所以基本上你的查询是试图找到符合zürich
的任何字符串,然后下一个字符必须是(来自你的第一个字符串)和
z
之间的字符(来自你的第二个字符串) - 包括本身和大多数字母字符。
这与区分大小写无关。
如果第二个字符串中没有z
,那么唯一匹配的字符串就是那些值为zürich
且只是尾随空格的字符串。
答案 1 :(得分:2)
这里有两个混乱:
平等与排序
当使用等于运算符=
时,区分大小写的问题更直接且更明显(例如“z”&lt;&gt;“Z”)。但是当使用>
和<
运算符时,需要进行排序,这与区分大小写和不区分大小写的区分开来。排序首先取决于哪种排序方式(见下一点)和然后可能由区分大小写确定。
字典顺序与二进制(即ASCII值/代码点)顺序
字典排序,默认值,表示将使用特定语言的字母顺序。特定语言是排序规则名称的一部分,例如Latin1_General
或Danish
。这将把“a”(ASCII = 97)和“A”(ASCII = 65)放在一起,将“Z”(ASCII = 90)放在一起。二进制排序规则(即以_BIN
或_BIN2
结尾的二进制排序规则)将使用二进制字符值,它将“Z”置于“A”和“a”之间。二进制排序必然区分大小写,因为它对所有内容都很敏感。字典排序将“A”和“a”组合在一起,但如果排序规则也区分大小写,它只会强制“A”出现在“a”之前。不区分大小写的字典排序可以混合“A”和“a”值(请参阅示例中的最终SELECT)。
现在让我们回到这个问题。当前排序规则为SQL_Latin1_General_CP1_CS_AS
,这是 Dictionary 排序。在查看字典时,Zürich和zürich将会背靠背地找到; Zürich不会仅仅因为它的资本 Z 而来 zany 。
查看查询返回的结果,第一个条目Zürich不应该存在。我不能让它被退回。由于这是一个区分大小写的排序规则,Zürich确实在zürich之前出现,并且会被WHERE
子句过滤掉。但其他两个值ZürichMülligen和Zürich80有效,因为它们符合WHERE
条款。如果您希望它们不匹配,那么您需要使用二进制排序规则而不是区分大小写的字典。
要查看此操作,请运行以下命令:
字典(Case-InSensitive):
SELECT tmp.val
FROM (SELECT 'bat'
UNION ALL
SELECT 'bar'
UNION ALL
SELECT 'bad'
UNION ALL
SELECT 'Bar') tmp(val)
ORDER BY tmp.val COLLATE SQL_Latin1_General_CP1_CI_AS ASC;
结果:
坏
酒吧
酒吧 - “酒吧”通常,但不一定,在“酒吧”之后 蝙蝠
字典(区分大小写):
SELECT tmp.val
FROM (SELECT 'bat'
UNION ALL
SELECT 'bar'
UNION ALL
SELECT 'bad'
UNION ALL
SELECT 'Bar') tmp(val)
ORDER BY tmp.val COLLATE SQL_Latin1_General_CP1_CS_AS ASC;
结果:
坏
酒吧 - “酒吧”必然在“酒吧”之前,但不是在“坏,甚至”b“之前 酒吧
蝙蝠
<强>二进制:强>
SELECT tmp.val
FROM (SELECT 'bat'
UNION ALL
SELECT 'bar'
UNION ALL
SELECT 'bad'
UNION ALL
SELECT 'Bar') tmp(val)
ORDER BY tmp.val COLLATE Latin1_General_BIN2 ASC;
结果:
Bar - “Bar”(“B”值= 66)必然在“b”之前(值= 98)
坏
酒吧
蝙蝠
为了更好地了解区分大小写如何影响一般的过滤和排序,请运行以下分步示例。
DECLARE @test TABLE (string VARCHAR(30)
COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL);
INSERT INTO @test (string) values ('A');
INSERT INTO @test (string) values ('B');
INSERT INTO @test (string) values ('Y');
INSERT INTO @test (string) values ('Z');
INSERT INTO @test (string) values ('a');
INSERT INTO @test (string) values ('b');
INSERT INTO @test (string) values ('y');
INSERT INTO @test (string) values ('z');
-- case-sensitive, dictionary ordered sorting via column collation
SELECT [string] AS [Test1] FROM @test ORDER BY string ASC;
/* -- upper-case and lower-case of each letter are grouped together;
-- upper-case consistently comes first due to case-sensitive
A
a
B
b
Y
y
Z
z
*/
-- case-sensitive comparison via column collation
SELECT [string] AS [Test2] FROM @test WHERE string = 'Y';
/* -- equality is straight-forward when using case-sensitive comparison
Y
*/
-- case-sensitive, dictionary ordered comparison and sorting via column collation
SELECT [string] AS [Test3] FROM @test WHERE string >= 'Y' ORDER BY string ASC;
/* -- upper-case comes first due to case-sensitive
Y
y
Z
z
*/
-- case-sensitive, dictionary ordered comparison and sorting via column collation
SELECT [string] AS [Test4] FROM @test WHERE string >= 'y' ORDER BY string ASC;
/* -- upper-case comes first due to case-sensitive
y
Z
z
*/
-- case-insensitive, dictionary ordered comparison via collation override
SELECT [string] AS [Test5] FROM @test
WHERE string > 'Y' COLLATE SQL_Latin1_General_CP1_CI_AS;
/* -- upper-case and lower-case are the same due to case-INsensitive
Z
z
*/
-- binary ordering via collation override
SELECT [string] AS [Test6] FROM @test ORDER BY string COLLATE Latin1_General_BIN ASC;
/*
A
B
Y
Z
a
b
y
z
*/
-- case-sensitive, dictionary ordered comparison via column collation;
-- binary ordering via collation override
SELECT [string] AS [Test7] FROM @test WHERE string >= 'y'
ORDER BY string COLLATE Latin1_General_BIN ASC;
/* -- lower-case 'y' comes before both 'Z' and 'z' when using a dictionary comparison
Z
y
z
*/
-- binary comparison via collation override;
-- binary ordering via collation override
SELECT [string] AS [Test8] FROM @test WHERE string >= 'y' COLLATE Latin1_General_BIN
ORDER BY string COLLATE Latin1_General_BIN ASC;
/* -- lower-case 'y' comes after all capitals when using a binary comparison
y
z
*/
-- case-insensitive, dictionary ordered sorting via collation override
SELECT [string] AS [Test9] FROM @test
ORDER BY string COLLATE SQL_Latin1_General_CP1_CI_AS ASC;
/* -- upper-case and lower-case of each letter are grouped together,
-- but inconsistent for upper-case vs lower-case first
A
a
b
B
Y
y
z
Z
*/
请参阅以下链接以获取某些SQL Server排序规则信息: