[sql] WHERE 절에서 대소 문자 구분 검색을 수행하는 방법 (SQL Server를 사용 중)?

SQL 쿼리에서 대소 문자를 구분하여 검색하고 싶습니다. 그러나 기본적으로 SQL Server는 문자열의 경우를 고려하지 않습니다.

SQL 쿼리에서 대소 문자 구분 검색을 수행하는 방법에 대한 아이디어가 있습니까?



답변

데이터 정렬변경하여 수행 할 수 있습니다 . 기본적으로 대소 문자를 구분합니다.

링크에서 발췌 :

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

또는 대소 문자를 구분하도록 열을 변경하십시오 .


답변

콜 레이션을 사용하거나 다음과 같이 바이너리로 캐스트합니다.

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 


답변

varbinary로 변환을 사용하여 쿼리를 만들 수 있습니다. 매우 쉽습니다. 예:

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


답변

BINARY_CHECKSUM 사용

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


답변

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

… in 절

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


답변

SQL DB에서 Latin1_General_CS를 데이터 정렬로 사용하십시오.


답변

MySQL에서는 데이터 정렬을 변경하지 않고 대소 문자 구분 검색을 수행하려면 다음 과 같이 이진 키워드를 사용 하십시오.

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