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


150

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

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

답변:


174

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

링크에서 발췌 :

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ßvs :/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

2
varbinary 메소드로 캐스트는 데이터베이스에서 직접 사용될 때 나에게 효과적이지만 .NET 응용 프로그램에서 동일한 명령문을 보낼 때 작동하지 않았습니다. 그러나 collate 방법은 잘 작동했습니다.
Doug

1
검색된 용어를 어디에 두어야하는지, 즉 일반 like "*word or phrase*"SQL 검색 과 유사한 구 가 삽입 되는 위치에 대한 설명이 포함 된 경우이 답변은 완벽합니다 .
통조림 맨

@CannedMan-위의 콜레이트 솔루션을 LIKE 문과 같은 방식으로 사용할 수 있습니다. 모든 대문자 'D'를 반환하려면 다음을 수행하십시오. "SELECT * FROM SomeSQL WHERE ColumnName '% D %'COLLATE SQL_Latin1_General_CP1_CS_AS"
Radderz

체코 알파벳으로는 작동하지 않습니다. 테스트 단어 : 'ukázka'. 표에 열의 단일 단어로 표시되어 있지만 검색에서 찾지 못했습니다.
Jan Macháekek

14

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

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

2
체코 알파벳으로는 작동하지 않습니다. 테스트 단어 : 'ukázka'. 표에 열의 단일 단어로 표시되어 있지만 검색에서 찾지 못했습니다.
Jan Macháekek

7

BINARY_CHECKSUM 사용

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

3
이것이 더 이상 정확한 비교가 아님을 의미하지 않습니까? 그들이 실제로 동일하지 않다는 것이 사실을 반환 할 수도 있습니다.
O'Rooney

3
@ O'Rooney에 동의합니다.
Des Horsley

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

... 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

5

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


2

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

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

2
유효한 SQL Server 쿼리가 아닙니다. 나는 그것이 MySQL이라고 생각한다
Jon Tirjan

2
MySQL에서 완벽하게 작동
WM

1
select * from incidentsnew1 
where BINARY_CHECKSUM(CloseBy) = BINARY_CHECKSUM(Upper(CloseBy))

-4

다른 사람들이 말했듯이 대소 문자 구분 검색을 수행 할 수 있습니다. 또는 나와 지정된 열의 데이터 정렬 형식을 변경하십시오. 내 데이터베이스의 사용자 / 암호 열에 대해 다음 명령을 통해 데이터 정렬을 데이터 정렬로 변경합니다.

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

암호를 일반 텍스트로 저장하지 마십시오! 그것들은 해시되고 소금에 절 여야했고, 비교는 해시와 소금에 대한 것입니다! 이것은 단순히 끔찍한 대답입니다!
Nelson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.