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.
select * from `table` where `column` = convert('value' using utf8mb4) collate utf8mb4_bin;
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 den latin1
Zeichensatz verwendet, und Ihr Server- / Sitzungszeichensatz ist utf8mb4
, 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 , in latin1
é als das Byte codiert ist , 0xE9
aber in utf8
es ist zwei Bytes: 0xC3A9
.
Warum convert
so gut wie collate
?
Kollatierungen müssen mit dem Zeichensatz übereinstimmen. Wenn Ihr Server oder Ihre Sitzung so eingestellt ist, dass der latin1
Zeichensatz verwendet collate latin1_bin
wird utf8mb4
, müssen Sie ihn verwenden collate 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
und collate
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 des binary
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 den utf8mb4
Zeichensatz verwenden.