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

Vee*_*era 134 sql sql-server

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

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

Jon*_*oln 157

通过使用排序规则或转换为二进制,如下所示:

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 
Run Code Online (Sandbox Code Playgroud)

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

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

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 
Run Code Online (Sandbox Code Playgroud)

  • 阅读此问题的人也可能会发现阅读如何将列本身更改为区分大小写有用,这样就无需在WHERE子句中使用排序规则.请参阅:http://stackoverflow.com/a/485394/908677 (13认同)
  • 当直接在数据库上使用时,cast as varbinary方法对我有用,但是当从.NET应用程序发送相同的语句时它不起作用 - 不知道为什么.但是整理方法运行良好. (2认同)

Ash*_*ain 148

可以通过更改排序来完成.默认情况下,它不区分大小写.

摘自链接:

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
Run Code Online (Sandbox Code Playgroud)

  • 当我们有=时如何使用。像(@CustID)中的WHERE CustID (2认同)
  • 适用于 LIKE 子句 ? (2认同)

Jua*_*lez 14

您可以使用convert to varbinary进行查询 - 这很容易.例:

Select * from your_table where convert(varbinary, your_column) = convert(varbinary, 'aBcD') 
Run Code Online (Sandbox Code Playgroud)

  • 它不适用于捷克语字母表.测试过的单词:'ukázka'.它在表格中作为单词中的单词,但您的搜索没有找到它. (2认同)

小智 7

使用BINARY_CHECKSUM

SELECT 
FROM Users
WHERE   
    BINARY_CHECKSUM(Username) = BINARY_CHECKSUM(@Username)
    AND BINARY_CHECKSUM(Password) = BINARY_CHECKSUM(@Password)
Run Code Online (Sandbox Code Playgroud)

  • 这不是意味着不再是精确的比较吗?有时可能会返回true,实际上它们并不相同吗? (2认同)
  • 我同意@ O'Rooney,这有时会返回误报。 (2认同)

Sum*_*shi 7

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

SELECT * FROM table_name WHERE binary username=@search_parameter and binary password=@search_parameter
Run Code Online (Sandbox Code Playgroud)

  • 这不是有效的 SQL Server 查询。我认为那是MySQL (3认同)
  • 在 MySQL 上完美运行 (2认同)

Dub*_*Dub 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
Run Code Online (Sandbox Code Playgroud)

......在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
Run Code Online (Sandbox Code Playgroud)

或找到一个价值

declare @value_b nvarchar(1) = 'A'

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

-- output:
-- A = A
Run Code Online (Sandbox Code Playgroud)


小智 5

使用Latin1_General_CS作为SQL数据库中的排序规则