Wie führe ich eine Suche mit Groß- und Kleinschreibung in der WHERE-Klausel durch (ich verwende SQL Server)?


150

Ich möchte in meiner SQL-Abfrage eine Suche mit Groß- und Kleinschreibung durchführen. Standardmäßig berücksichtigt SQL Server den Fall der Zeichenfolgen jedoch nicht.

Haben Sie eine Idee, wie Sie in SQL-Abfragen zwischen Groß- und Kleinschreibung suchen können?

Antworten:


174

Kann durch Ändern der Sortierung erfolgen . Standardmäßig wird die Groß- und Kleinschreibung nicht berücksichtigt.

Auszug aus dem 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

Oder ändern Sie die Spalten so, dass zwischen Groß- und Kleinschreibung unterschieden wird .


2
Wie zu verwenden, wenn wir stattdessen in haben =. wie WHERE CustID in (@CustID)
Rinuthomaz

Die Sortierung funktioniert in den meisten Fällen, aber wenn Ihre Daten andere Sprachzeichen enthalten, werden falsch positive /schwarz-weiß/schwarz-weiss
Ergebnisse zurückgegeben

162

Verwenden Sie die Sortierung oder das Casting in eine Binärdatei wie folgt:

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 

Die doppelte Angabe von Benutzername / Passwort gibt der Engine die Möglichkeit, Indizes zu verwenden. Bei der obigen Sortierung handelt es sich um eine Sortierung, bei der zwischen Groß- und Kleinschreibung unterschieden wird. Wechseln Sie bei Bedarf zu der von Ihnen benötigten.

Das zweite, Casting in Binär, könnte folgendermaßen durchgeführt werden:

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
Personen, die diese Frage lesen, finden es möglicherweise auch hilfreich zu lesen, wie die Spalte selbst so geändert wird, dass zwischen Groß- und Kleinschreibung unterschieden wird, sodass die Kollatierung in der WHERE-Klausel nicht mehr erforderlich ist. Siehe: stackoverflow.com/a/485394/908677
Elijah Lofgren

2
Die Cast als varbinary-Methode funktionierte für mich, wenn sie direkt in der Datenbank verwendet wurde, aber nicht, wenn dieselbe Anweisung aus einer .NET-Anwendung gesendet wurde - keine Ahnung warum. Aber die Sortiermethode hat gut funktioniert.
Doug

1
Diese Antwort wäre perfekt, wenn sie eine Erklärung enthalten würde, wo der gesuchte Begriff platziert werden soll, dh wo der Ausdruck like "*word or phrase*"eingefügt wird , der einer regulären SQL-Suche ähnelt .
Canned Man

@CannedMan - Sie können die obige Sortierlösung auf dieselbe Weise mit der LIKE-Anweisung verwenden. Gehen Sie einfach wie folgt vor, um alle Großbuchstaben zurückzugeben. "SELECT * FROM SomeTable WHERE Spaltenname wie '% D%' COLLATE SQL_Latin1_General_CP1_CS_AS"
Radderz

Es funktioniert nicht mit tschechischem Alphabet. Getestetes Wort: 'ukázka'. Es ist in der Tabelle als einzelnes Wort in einer Spalte enthalten, aber Ihre Suche hat es nicht gefunden.
Jan Macháček

14

Sie können die Abfrage mithilfe der Konvertierung in varbinary durchführen - das ist sehr einfach. Beispiel:

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

2
Es funktioniert nicht mit tschechischem Alphabet. Getestetes Wort: 'ukázka'. Es ist in der Tabelle als einzelnes Wort in einer Spalte enthalten, aber Ihre Suche hat es nicht gefunden.
Jan Macháček

7

BENUTZEN SIE BINARY_CHECKSUM

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

3
Würde das nicht bedeuten, dass es kein genauer Vergleich mehr ist? Es kann manchmal vorkommen, dass es wahr ist, dass sie nicht wirklich gleich sind?
O'Rooney

3
Ich bin mit @ O'Rooney einverstanden, dass dies gelegentlich zu Fehlalarmen führt.
Des Horsley

5

benutze 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 der where-Klausel

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

oder um einen Wert zu finden

declare @value_b nvarchar(1) = 'A'

select  ValueB + ' = ' + @value_b
from    @example
where   hashbytes('SHA1', ValueB) = hasbytes('SHA1', @value_b)

-- output:
-- A = A

5

Verwenden Sie Latin1_General_CS als Ihre Sortierung in Ihrer SQL-Datenbank


2

Wenn Sie in MySQL die Sortierung nicht ändern und zwischen Groß- und Kleinschreibung unterscheiden möchten, verwenden Sie einfach das folgende binäre Schlüsselwort:

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

2
Dies ist keine gültige SQL Server-Abfrage. Ich denke, das ist MySQL
Jon Tirjan

2
Funktioniert perfekt unter MySQL
WM

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

-4

Wie bereits erwähnt, können Sie eine Suche mit Groß- und Kleinschreibung durchführen. Oder ändern Sie einfach das Sortierformat einer bestimmten Spalte wie ich. Für die Benutzer- / Kennwortspalten in meiner Datenbank ändere ich sie mit dem folgenden Befehl in Sortierung:

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

Speichern Sie Passwörter NICHT als Klartext! Sie hätten gehackt und gesalzen werden sollen, und dann ist der Vergleich bei Haschisch und Salz! Das ist einfach eine schreckliche Antwort!
Nelson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.