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.