Ich habe eine Funktion, die fünf Zeichen mit gemischter Groß- und Kleinschreibung zurückgibt. Wenn ich eine Abfrage für diese Zeichenfolge durchführe, wird der Wert unabhängig von der Groß- und Kleinschreibung zurückgegeben.
Wie kann ich bei MySQL-String-Abfragen zwischen Groß- und Kleinschreibung unterscheiden?
mysql
sql
interop
case-sensitive
string-comparison
StevenB
quelle
quelle
Antworten:
http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
quelle
SELECT 'email' COLLATE utf8_bin = 'Email'
Die gute Nachricht ist, dass es sehr einfach ist, eine Abfrage durchzuführen, bei der zwischen Groß- und Kleinschreibung unterschieden wird:
quelle
convert(char(0x65,0xcc,0x88) using utf8)
(dhe
mit¨
hinzugefügt) undconvert(char(0xc3,0xab) using utf8)
(dhë
), aber durch HinzufügenBINARY
werden sie ungleich.Antwort von Craig White gepostet, hat große Leistungseinbußen
weil es keine Indizes verwendet. Entweder müssen Sie die Tabellensortierung wie hier erwähnt ändern: https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html .
ODER
Am einfachsten zu beheben, sollten Sie ein BINARY von Wert verwenden.
Z.B.
VS
1 Reihe im Satz (0,00 Sek.)
quelle
Anstatt den Operator = zu verwenden, möchten Sie möglicherweise LIKE oder LIKE BINARY verwenden
Es wird 'a' und nicht 'A' in seinem Zustand annehmen
quelle
Um einen Index zu verwenden, bevor Sie BINARY verwenden, können Sie Folgendes tun, wenn Sie große Tabellen haben.
Die Unterabfrage würde zu einer wirklich kleinen Teilmenge ohne Berücksichtigung der Groß- und Kleinschreibung führen, von der Sie dann die einzige Übereinstimmung auswählen, bei der die Groß- und Kleinschreibung beachtet wird.
quelle
Die korrekteste Methode zum Durchführen eines Zeichenfolgenvergleichs ohne Berücksichtigung der Groß- und Kleinschreibung, ohne die Sortierung der abgefragten Spalte zu ändern, besteht darin, einen Zeichensatz und eine Sortierung für den Wert, mit dem die Spalte verglichen wird, explizit anzugeben.
Warum nicht verwenden
binary
?Die Verwendung des
binary
Operators wird nicht empfohlen, da er die tatsächlichen Bytes der codierten Zeichenfolgen vergleicht. Wenn Sie die tatsächlichen Bytes von zwei Zeichenfolgen vergleichen, die mit den verschiedenen Zeichensätzen codiert wurden, sind zwei Zeichenfolgen, die als gleich angesehen werden sollten, möglicherweise nicht gleich. Wenn Sie beispielsweise eine Spalte haben, die denlatin1
Zeichensatz verwendet, und Ihr Server- / Sitzungszeichensatz istutf8mb4
, wenn Sie die Spalte mit einer Zeichenfolge vergleichen, die einen Akzent wie "Café" enthält, stimmt sie nicht mit Zeilen überein, die dieselbe Zeichenfolge enthalten! Dies liegt daran , inlatin1
é als das Byte codiert ist ,0xE9
aber inutf8
es ist zwei Bytes:0xC3A9
.Warum
convert
so gut wiecollate
?Kollatierungen müssen mit dem Zeichensatz übereinstimmen. Wenn Ihr Server oder Ihre Sitzung so eingestellt ist, dass der
latin1
Zeichensatz verwendetcollate latin1_bin
wirdutf8mb4
, müssen Sie ihn verwendencollate utf8mb4_bin
. Wenn Ihr Zeichensatz jedoch so eingestellt ist , müssen Sie ihn verwenden . Daher besteht die robusteste Lösung darin, den Wert immer in den flexibelsten Zeichensatz umzuwandeln und die binäre Sortierung für diesen Zeichensatz zu verwenden.Warum das
convert
undcollate
auf den Wert und nicht auf die Spalte anwenden ?Wenn Sie vor dem Vergleich eine Transformationsfunktion auf eine Spalte anwenden, wird verhindert, dass die Abfrage-Engine einen Index verwendet, falls für die Spalte einer vorhanden ist, was Ihre Abfrage erheblich verlangsamen kann. Daher ist es immer besser, den Wert nach Möglichkeit zu transformieren. Wenn ein Vergleich zwischen zwei Zeichenfolgenwerten durchgeführt wird und einer von ihnen eine explizit angegebene Kollatierung aufweist, verwendet die Abfrage-Engine die explizite Kollatierung, unabhängig davon, auf welchen Wert sie angewendet wird.
Akzentempfindlichkeit
Es ist wichtig zu beachten, dass MySql nicht nur bei Spalten, bei denen eine
_ci
Sortierung verwendet wird (normalerweise die Standardeinstellung), die Groß- und Kleinschreibung nicht berücksichtigt , sondern auch bei Akzenten nicht berücksichtigt wird . Das bedeutet das'é' = 'e'
. Durch die Verwendung einer binären Kollatierung (oder desbinary
Operators) werden Zeichenfolgenvergleiche sowohl akzent- als auch case-abhängig gemacht.Was ist
utf8mb4
?Der
utf8
Zeichensatz in MySql ist ein Alias,utf8mb3
der in neueren Versionen nicht mehr unterstützt wird, da er keine 4-Byte-Zeichen unterstützt (was für die Codierung von Zeichenfolgen wie 🐈 wichtig ist). Wenn Sie die UTF8-Zeichencodierung mit MySQL verwenden möchten, sollten Sie denutf8mb4
Zeichensatz verwenden.quelle
Das Folgende gilt für MySQL-Versionen, die gleich oder höher als 5.5 sind.
Zu /etc/mysql/my.cnf hinzufügen
Alle anderen Kollatierungen, die ich versuchte, schienen die Groß- und Kleinschreibung nicht zu berücksichtigen, nur "utf8_bin" funktionierte.
Vergessen Sie nicht, MySQL danach neu zu starten:
Laut http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html gibt es auch einen "latin1_bin".
Das "utf8_general_cs" wurde vom MySQL-Start nicht akzeptiert. (Ich habe "_cs" als "case-sensitive" gelesen - ???).
quelle
Sie können BINARY verwenden, um zwischen Groß- und Kleinschreibung zu unterscheiden
Leider kann dieser SQL-Index nicht verwendet werden. Bei Abfragen, die von diesem Index abhängen, tritt ein Leistungseinbruch auf
Zum Glück habe ich ein paar Tricks, um dieses Problem zu lösen
quelle
Ausgezeichnet!
Ich teile mit Ihnen Code aus einer Funktion, die Passwörter vergleicht:
quelle
declare pSuccess BINARY;
Auf DB-Ebene müssen keine Änderungen vorgenommen werden. Sie müssen lediglich Änderungen an SQL Query vornehmen, damit dies funktioniert.
Beispiel -
"SELECT * FROM <TABLE> where userId = '" + iv_userId + "' AND password = BINARY '" + iv_password + "'";
Durch das binäre Schlüsselwort wird die Groß- und Kleinschreibung beachtet.
quelle
MySQL unterscheidet standardmäßig nicht zwischen Groß- und Kleinschreibung. Ändern Sie die Sprachkollatierung in
latin1_general_cs
quelle