SQL区分大小写的字符串比较


234

如何比较字符串,以便仅在每个字符串的大小写相等的情况下,比较才为真。例如:

Select * from a_table where attribute = 'k'

...将返回具有'K'属性的行。我不要这种行为。


可能不是您所需要的,但是您可以更改排序规则或在查询中使用特定的排序规则。
凯恩

7
哪个SQL产品?
2010年

Answers:


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

做到了。


4
我通常会使用Latin1_General_Bin
gbn

3
是的,标准方法是使用不区分大小写的归类,尽管归类本身是特定于供应商的。您的SQL Server语法是吗?
2010年

就我而言,我的数据库中有1列区分大小写。我需要将其与标准(CI)列进行比较。我使用了此WHERE Foo.Bar =(Baz.Bar COLLATE Latin1_General_CS_AS)的变体
催眠病毒2014年

2
谢谢,但是Latin1_General_CS_AS是什么?它是特殊关键字吗?
维杰·辛格·拉纳

2
@VijaySinghRana Latin1_General_CS_AS是排序规则的规范。整理是指一组确定数据如何排序和比较的规则。有关更多信息,请参见此页面
amccormack 2015年

51

您还可以使用以下语法将该属性转换为区分大小写

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

29

您可以轻松地将列转换为VARBINARY(Max Length),该长度必须是您期望的最大长度,以避免比较不良;将长度设置为列长度就足够了。修剪列可帮助您比较实际值,但空格具有含义并在表列中进行赋值,这是一个简单的示例,如您所见,我修剪了列值,然后进行转换和比较。:

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

希望能有所帮助。


2
正是我想要的。一种简单的一次性区分大小写的比较方法,以查找包含大写字母的条目。
Mike D.

20

就像您可以使用HASHBYTES一样,这是另一种替代方法:

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

1
碰撞呢?这种情况很少见,但我假设会有多个字符串散列为相同的值。
David Klempfner

是可能的,但是在我认为如此简单的字符串示例中,这种情况极为罕见。
戴夫·塞克斯顿

@DavidKlempfner为什么不先进行比较,如果匹配,然后还要检查哈希字节?我们可以使它成为一个函数并像StringsAreCaseSensitiveEqual(a,b)=> a = b AND HASHBYTES('sha1',a)= HASHBYTES('sha1',b)一样调用它
Demetris Leptos

3

您可以定义attributeBINARY或使用INSTRSTRCMP执行搜索。


对于每个问号,此答复似乎与SQL Server无关。这DBMS缺乏这些INSTRSTRCMP功能。
乔纳斯(Jonas)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.