programing

WHERE 절(SQL Server 사용 중)에서 대소문자를 구분하는 검색 방법은 무엇입니까?

lastcode 2023. 4. 7. 21:27
반응형

WHERE 절(SQL Server 사용 중)에서 대소문자를 구분하는 검색 방법은 무엇입니까?

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

SQL 쿼리에서 대소문자를 구분하는 검색 방법을 알고 계십니까?

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

링크에서 발췌:

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

또는 대소문자를 구분하도록 열을 변경합니다.

대소문자를 구분하기 위해 COLATE를 LIKE에 적용할 수도 있습니다.

SELECT    *
FROM     tbl_Partners
WHERE    PartnerName COLLATE SQL_Latin1_General_CP1_CS_AS LIKE 'MyEx%' 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 

2진수로 변환하여 쿼리를 작성할 수 있습니다.이 작업은 매우 간단합니다.예:

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

이진_CHECKSUM 사용

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

해시 바이트 사용

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

Latin1_General_ 사용sql db에서의 대조로서 CS를 사용합니다.

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

SELECT * FROM table_name WHERE binary username=@search_parameter and binary password=@search_parameter
select * from incidentsnew1 
where BINARY_CHECKSUM(CloseBy) = BINARY_CHECKSUM(Upper(CloseBy))

다음과 같이 열 정렬을 변경하는 것만으로 수행할 수 있습니다.

Alter Table UserMaster 
Alter Column Password varchar(50) COLLATE SQL_Latin1_General_CP1_CS_AS

Entity Framework 접근법에 관심이 있는 경우:

var customers = context.Customers
.Where(c => EF.Functions.Collate(c.Name, "SQL_Latin1_General_CP1_CS_AS") == "John")
.ToList();

참조: https://learn.microsoft.com/en-us/ef/core/miscellaneous/collations-and-case-sensitivity#explicit-collation-in-a-query

다른 사용자가 말한 대로 대소문자를 구분하는 검색을 수행할 수 있습니다.또는 지정된 컬럼의 조합 형식을 저로 변경할 수도 있습니다.데이터베이스의 User/Password 열에 대해 다음 명령을 사용하여 정렬로 변경합니다.

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

언급URL : https://stackoverflow.com/questions/1831105/how-to-do-a-case-sensitive-search-in-where-clause-im-using-sql-server

반응형