Sql server 为什么SQL Server版本15.0.4033.1中的不同字符串(仅大小写不同)相同?

Sql server 为什么SQL Server版本15.0.4033.1中的不同字符串(仅大小写不同)相同?,sql-server,Sql Server,当我将此代码用作测试时: declare @s1 varchar(100) set @s1 = 'AABA/2AA2AAA6YBAAc' declare @s2 varchar(100) set @s2 = 'AABA/2AA2AAA6YBAAC' IF @s1=@s2 BEGIN PRINT 'Same' END ELSE BEGIN PRINT 'Not Same' END 结果是“相同的”。对我来说这听起来很奇怪,因为s1和s2是不同的(见最后一个字符c和c) 为什么SQ

当我将此代码用作测试时:

declare @s1 varchar(100) set @s1 = 'AABA/2AA2AAA6YBAAc'
declare @s2 varchar(100) set @s2 = 'AABA/2AA2AAA6YBAAC'
IF
@s1=@s2
BEGIN
    PRINT 'Same'
END
ELSE
BEGIN
    PRINT 'Not Same'
END
结果是“相同的”。对我来说这听起来很奇怪,因为s1和s2是不同的(见最后一个字符c和c)


为什么SQL Server告诉我它们是相同的?

这取决于排序规则

要了解数据库上下文中的排序规则,请查询:

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation')

CI表示不区分大小写。

它取决于排序规则

要了解数据库上下文中的排序规则,请查询:

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation')
CI表示不区分大小写。

。很明显,您使用的是不区分大小写的排序规则,因此在比较操作中,大小写字母被视为相同的。如果不希望不同的大小写值显示相同,请使用区分大小写的排序规则

例如,在下面的示例中,我更改了
IF
中变量
@s2
的排序规则。如果这是一个表,您可能需要更改列的定义:

DECLARE@s1 varchar(100);
SET@s1='AABA/2AA2AAA6YBAAc'
声明@s2 varchar(100);
SET@s2='AABA/2AA2AAA6YBAAC'
如果@s1=@s2将SQL\u拉丁1\u常规\u CP1\u CS\u整理为开始
打印“相同”
结束,否则开始
打印“不一样”
结束
。很明显,您使用的是不区分大小写的排序规则,因此在比较操作中,大小写字母被视为相同的。如果不希望不同的大小写值显示相同,请使用区分大小写的排序规则

例如,在下面的示例中,我更改了
IF
中变量
@s2
的排序规则。如果这是一个表,您可能需要更改列的定义:

DECLARE@s1 varchar(100);
SET@s1='AABA/2AA2AAA6YBAAc'
声明@s2 varchar(100);
SET@s2='AABA/2AA2AAA6YBAAC'
如果@s1=@s2将SQL\u拉丁1\u常规\u CP1\u CS\u整理为开始
打印“相同”
结束,否则开始
打印“不一样”
结束

这是因为它不区分大小写,您可以通过以下代码尝试这种简单的方法来实现您的需求:

declare @s1 varchar(100) set @s1 = 'AABA/2AA2AAA6YBAAc'
declare @s2 varchar(100) set @s2 = 'AABA/2AA2AAA6YBAAC'
IF HASHBYTES('sha1', @s1)=HASHBYTES('sha1', @s2)
BEGIN
    PRINT 'Same'
END
ELSE
BEGIN
    PRINT 'Not Same'
END

这段代码使用Hashbytes来实现这一点。

这是因为它不区分大小写,您可以通过以下代码尝试这种简单的方法来实现您的需求:

declare @s1 varchar(100) set @s1 = 'AABA/2AA2AAA6YBAAc'
declare @s2 varchar(100) set @s2 = 'AABA/2AA2AAA6YBAAC'
IF HASHBYTES('sha1', @s1)=HASHBYTES('sha1', @s2)
BEGIN
    PRINT 'Same'
END
ELSE
BEGIN
    PRINT 'Not Same'
END

此代码使用Hashbytes进行匹配。

使用二进制排序比使用
Hashbytes
执行二进制匹配更具语义更清晰的是:IF(a)s1=(a)s2 COLLATE Latin1_General_100_CS_ASIt使用二进制排序比使用
HASHBYTES
执行二进制匹配更具语义更清晰的是:如果(a)s1=(a)s2 COLLATE Latin1_General_100_CS作为排序的概念自1986年以来来自标准SQL,并引用大小写(CI/CS)或变音符号敏感性(AS/ASI-重音、连字…),广泛的字符和一些国家语言的更多特征(例如,使用日语字母时的假名类型)…MS SQL Server有大约5000种不同的排序规则。在SQL Server 2019中,我们现在的排序规则超过5500种;由于新的UTF8排序规则,增加了很多。排序规则的概念自1986年以来来自标准SQL,指的是大小写(CI/CS)或变音符号敏感性(AS/ASI-重音、连字…),广泛的字符和一些国家语言的更多功能(例如,在使用日语字母时使用假名类型)…MS SQL Sever有大约5000种不同的排序规则。在SQL Server 2019中,我们现在的排序规则超过5500;由于新的UTF8排序规则,增加了很多。