如何在WHERE子句中进行区分大小写的搜索(我正在使用SQL Server)?


150

我想在我的SQL查询中进行区分大小写的搜索。但是默认情况下,SQL Server不考虑字符串的大小写。

关于如何在SQL查询中进行区分大小写的搜索的任何想法?

Answers:


174

可以通过更改Collat​​ion来完成。默认情况下,它不区分大小写。

链接摘录:

SELECT 1
FROM dbo.Customers
WHERE   CustID = @CustID COLLATE SQL_Latin1_General_CP1_CS_AS
    AND CustPassword = @CustPassword COLLATE SQL_Latin1_General_CP1_CS_AS

或者,将列更改为区分大小写


2
当我们进入=时如何使用。像(@CustID)中的WHERE CustID
rinuthomaz

排序规则适用于大多数情况,但是如果您的数据中包含其他语言字符,它将返回误报:/schwarz-weiß与:/schwarz-weiss
Lazlow

162

通过使用归类或强制转换为二进制,如下所示:

SELECT *
FROM Users
WHERE   
    Username = @Username COLLATE SQL_Latin1_General_CP1_CS_AS
    AND Password = @Password COLLATE SQL_Latin1_General_CP1_CS_AS
    AND Username = @Username 
    AND Password = @Password 

用户名/密码的重复存在使引擎可以使用索引。上面的排序规则是区分大小写的排序规则,如有必要,请更改为所需的排序规则。

第二个,转换为二进制,可以这样完成:

SELECT *
FROM Users
WHERE   
    CAST(Username as varbinary(100)) = CAST(@Username as varbinary))
    AND CAST(Password as varbinary(100)) = CAST(@Password as varbinary(100))
    AND Username = @Username 
    AND Password = @Password 

13
阅读此问题的人们可能还会发现,阅读如何将列本身更改为区分大小写很有用,从而无需在WHERE子句中使用排序规则。请参阅:stackoverflow.com/a/485394/908677
Elijah Lofgren 2015年

2
直接在数据库上使用时,强制转换为varbinary方法对我有效,但是从.NET应用程序发送相同的语句时,无效。但是整理方法很好用。
道格

1
如果此答案包括解释将搜索词放在何处的解释,即类似于常规like "*word or phrase*"SQL搜索的词组将插入何处,则该答案将是完美的。
罐头人

@CannedMan-您可以使用与LIKE语句相同的方式使用上述整理解决方案。只需执行以下操作即可返回所有大写字母'D'。“ SELECT * FROM SomeTable WHERE ColumnName像'%D%'COLLATE SQL_Latin1_General_CP1_CS_AS”
Radderz

它不适用于捷克字母。经过测试的字词:“ukázka”。它在表格中以单列形式出现在表中,但您的搜索未找到它。
JanMacháček'18

14

您可以使用convert to varbinary进行查询-非常简单。例:

Select * from your_table where convert(varbinary, your_column) = convert(varbinary, 'aBcD') 

2
它不适用于捷克字母。经过测试的字词:“ukázka”。它在表格中以单列形式出现在表中,但您的搜索未找到它。
JanMacháček'18

7

使用BINARY_CHECKSUM

SELECT 
FROM Users
WHERE   
    BINARY_CHECKSUM(Username) = BINARY_CHECKSUM(@Username)
    AND BINARY_CHECKSUM(Password) = BINARY_CHECKSUM(@Password)

3
这不是意味着不再是精确的比较吗?有时可能会返回true,实际上它们并不相同吗?
奥鲁尼

3
我同意@ O'Rooney,这有时会返回误报。
Des Horsley 2015年

5

使用HASHBYTES

declare @first_value nvarchar(1) = 'a'
declare @second_value navarchar(1) = 'A'

if HASHBYTES('SHA1',@first_value) = HASHBYTES('SHA1',@second_value) begin
    print 'equal'
end else begin
    print 'not equal'
end

-- output:
-- not equal

...在where子句中

declare @example table (ValueA nvarchar(1), ValueB nvarchar(1))

insert into @example (ValueA, ValueB)
values  ('a', 'A'),
        ('a', 'a'),
        ('a', 'b')

select  ValueA + ' = ' + ValueB
from    @example
where   hashbytes('SHA1', ValueA) = hashbytes('SHA1', ValueB)

-- output:
-- a = a

select  ValueA + ' <> ' + ValueB
from    @example
where   hashbytes('SHA1', ValueA) <> hashbytes('SHA1', ValueB)

-- output:
-- a <> A
-- a <> b

或寻找价值

declare @value_b nvarchar(1) = 'A'

select  ValueB + ' = ' + @value_b
from    @example
where   hashbytes('SHA1', ValueB) = hasbytes('SHA1', @value_b)

-- output:
-- A = A


2

在MySQL中,如果您不想更改排序规则并希望执行区分大小写的搜索,则只需使用如下所示的二进制关键字:

SELECT * FROM table_name WHERE binary username=@search_parameter and binary password=@search_parameter

2
这不是有效的SQL Server查询。我认为这是MySQL
Jon Tirjan '17

2
在MySQL上完美运行
WM


-4

正如其他人所说,您可以执行区分大小写的搜索。或者只是像我一样更改指定列的排序规则格式。对于我数据库中的“用户/密码”列,我通过以下命令将它们更改为归类:

ALTER TABLE `UserAuthentication` CHANGE `Password` `Password` VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL;

不要将密码存储为纯文本!他们应该已经被哈希和加盐,然后比较就在哈希和盐上!这简直是​​一个可怕的答案!
尼尔森
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.