如何比较字符串,使比较只有在每个字符串的大小写相等时才为真。例如:

Select * from a_table where attribute = 'k'

...将返回一个属性为'K'的行。我不想要这种行为。


当前回答

就像你可以使用HASHBYTES的另一种选择一样,像这样:

SELECT * 
FROM a_table 
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')

其他回答

您可以将属性定义为BINARY或使用INSTR或STRCMP执行搜索。

Select * from a_table where attribute = 'k' COLLATE Latin1_General_CS_AS 

成功了。

你也可以使用下面的语法将该属性转换为区分大小写:

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CS_AS

现在您的搜索将区分大小写。

如果您想再次使该列不区分大小写,则使用

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CI_AS

你可以很容易地将列转换为VARBINARY(最大长度),长度必须是你期望的最大长度,以避免有缺陷的比较,这就足够将长度设置为列的长度。修剪列帮助你比较真实的值,除了空间在你的表列中有意义和价值,这是一个简单的例子,正如你所看到的,我修剪列值,然后转换和比较:

CONVERT(VARBINARY(250),LTRIM(RTRIM(Column1))) = CONVERT(VARBINARY(250),LTRIM(RTRIM(Column2)))

希望这对你有所帮助。

就像你可以使用HASHBYTES的另一种选择一样,像这样:

SELECT * 
FROM a_table 
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')