Hoe een hoofdlettergevoelige zoekopdracht te doen in waar clausule (ik gebruik SQL Server)?

Ik wil een hoofdlettergevoelige zoeken doen in mijn SQL-query. Maar standaard beschouwt SQL Server niet het geval van de snaren.

Enig idee over het uitvoeren van een caseuengevoelige zoekopdracht in SQL-query?


Antwoord 1, Autoriteit 100%

kan worden gedaan via het veranderen van de collatie . Standaard is het geval ongevoelig.

Uittreksel van de link:

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

of, Wijzig de kolommen als hoofdlettergevoelig .


Antwoord 2, Autoriteit 80%

Door collation of casting naar binair te gebruiken, zoals dit:

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 

De duplicatie van gebruikersnaam / wachtwoord bestaat om de motor de mogelijkheid te geven om indexen te gebruiken. De bovenstaande collatie is een hoofdlettergevoelige collatie, verandering in degene die u nodig hebt indien nodig.

De tweede, gieten naar binair, kan zo worden gedaan:

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 

Antwoord 3, autoriteit 7%

U kunt de query maken met convert to varbinary – het is heel eenvoudig.
Voorbeeld:

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

Antwoord 4, autoriteit 3%

GEBRUIK BINARY_CHECKSUM

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

Antwoord 5, autoriteit 3%

HASHBYTES gebruiken

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 waar-clausule

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

of om een waarde te vinden

declare @value_b nvarchar(1) = 'A'
select  ValueB + ' = ' + @value_b
from    @example
where   hashbytes('SHA1', ValueB) = hasbytes('SHA1', @value_b)
-- output:
-- A = A

Antwoord 6, autoriteit 2%

gebruik Latin1_General_CS als uw sortering in uw sql db


Antwoord 7

Als u in MySQL de sortering niet wilt wijzigen en hoofdlettergevoelig wilt zoeken, gebruik dan gewoon het binaire-zoekwoord als volgt:

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

Antwoord 8

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

Antwoord 9

Zoals anderen al zeiden, kunt u hoofdlettergevoelig zoeken. Of verander gewoon het sorteerformaat van een opgegeven kolom zoals ik. Voor de User/Password-kolommen in mijn database verander ik ze in collatie via het volgende commando:

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

Other episodes