Как сделать поиск с учетом регистра в предложении WHERE (я использую SQL Server)?

Я хочу, чтобы в моем SQL-запросе выполнялся регистр, чувствительный к регистру. Но по умолчанию SQL Server не рассматривает случай строк.

Любая идея о том, как делать чувствительный к регистру поиск в SQL-запросе?

Ответ 2

Используя сопоставление или кастинг в двоичном формате, например:

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 

Ответ 3

Вы можете сделать запрос с помощью convert в varbinary - это очень просто. Пример:

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

Ответ 4

ИСПОЛЬЗОВАТЬ BINARY_CHECKSUM

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

Ответ 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

Ответ 6

используйте Latin1_General_CS как свою сортировку в вашем sql db

Ответ 7

В MySQL, если вы не хотите изменять сортировку и хотите выполнить поиск с учетом регистра, просто используйте бинарное ключевое слово:

SELECT * FROM table_name WHERE binary [email protected]_parameter and binary [email protected]_parameter

Ответ 8

Примечание: это было для MySQL/Postgres/Microsoft SQL Server, но оно также работало на DB2.

Я предположил, что есть более простой способ сделать это без всякой дополнительной работы. например, вы можете использовать функцию UPPER (или ниже). Это помогло мне найти любую вариацию Атабаски:

WHERE UPPER (ADDR_CITY), КАК ВЕРХНИЙ ("Атабаска")

Работай умом, а не силой! :) Кинан

Ответ 9

Как и другие, вы можете выполнять поиск с учетом регистра. Или просто измените формат сортировки указанного столбца как меня. Для столбцов User/Password в моей базе данных я меняю их на сортировку с помощью следующей команды:

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