SQL Server查询的大小写敏感性

20

我有这个数据库:

abcDEF

ABCdef

abcdef

如果我写下: select * from MyTbl where A='ABCdef'

如何获取: ABCdef

以及如何获取:

abcDEF

    ABCdef

    abcdef

提前感谢。

忘记写了 - sqlCE。


3
大写字母/小写字母,不是big/small。 - Oded
5个回答

34

您可以通过使用COLLATE关键字使查询区分大小写。

SELECT A 
FROM MyTbl 
WHERE A COLLATE Latin1_General_CS_AS = 'ABCdef'

6
如果你的数据库中已经存在abcDEF、ABCdef和abcdef,那么它已经区分大小写,或者你没有设置约束。如果要确保在不区分大小写的数据库中实现区分大小写,需要在两侧添加COLLATE,但这会使索引失效。
SELECT TheColumn
FROM MyTable 
WHERE TheColumn COLLATE Latin1_General_CS_AS = 'ABCdef' COLLATE Latin1_General_CS_AS

那么重音符号呢? Latin1_General_CS_AILatin1_General_Bin 呢?


3

尝试在where后面加上二进制关键字:

select * from MyTbl where binary A = 'ABCdef';

1

SQL默认情况下不区分大小写,因此如果进行简单的字符串比较,您将获得所有三个项目。为了使其区分大小写,您可以将字段的值和搜索值都转换为varbinary类型:

SELECT * FROM MyTbl WHERE CAST(A AS varbinary(20)) = CAST('ABCdef' as varbinary(20))

以上假设您的 varchar 字段大小为 20。如果是 nvarchar,请将其加倍(感谢 @ps2goat)。

2
哇,那是最糟糕的答案 - 去掉所有索引,强制进行表扫描,并完全忽略能够更改排序规则的现实 ;) - TomTom
3
使用COLLATE意味着索引将不会被使用。 - Martin Smith
2
我相信还有更糟糕的答案——至少这个查询是可用的。据我所知,除非进行二进制比较,否则无法使用索引指定不区分大小写。我从未尝试过,但如果您的表列定义为VARBINARY,则可以在其上执行索引,并且只需要转换搜索字符串即可。 - Josh Anderson
如果一个nvarchar长度为20个字符,那么它不是应该有40个字节吗? - ps2goat

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接