Verschiedene Operatoren
LIKE
und =
sind verschiedene Operatoren. Die meisten Antworten konzentrieren sich auf die Wildcard-Unterstützung, die nicht der einzige Unterschied zwischen diesen Operatoren ist!
=
ist ein Vergleichsoperator, der mit Zahlen und Zeichenfolgen arbeitet. Beim Vergleichen von Zeichenfolgen vergleicht der Vergleichsoperator ganze Zeichenfolgen .
LIKE
ist ein Zeichenfolgenoperator, der Zeichen für Zeichen vergleicht .
Um die Sache zu verkomplizieren, verwenden beide Operatoren eine Kollatierung, die wichtige Auswirkungen auf das Vergleichsergebnis haben kann.
Motivierendes Beispiel
Lassen Sie uns zunächst ein Beispiel identifizieren, bei dem diese Operatoren offensichtlich unterschiedliche Ergebnisse liefern. Lassen Sie mich aus dem MySQL-Handbuch zitieren:
Gemäß dem SQL-Standard führt LIKE den Abgleich auf Zeichenbasis durch, sodass Ergebnisse erzielt werden können, die sich vom Vergleichsoperator = unterscheiden:
mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
+-----------------------------------------+
| 'ä' LIKE 'ae' COLLATE latin1_german2_ci |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
+--------------------------------------+
| 'ä' = 'ae' COLLATE latin1_german2_ci |
+--------------------------------------+
| 1 |
+--------------------------------------+
Bitte beachten Sie, dass diese Seite des MySQL-Handbuchs als String-Vergleichsfunktionen bezeichnet wird und =
nicht behandelt wird, was dies impliziert=
es sich nicht ausschließlich um eine String-Vergleichsfunktion handelt.
Wie funktioniert das =
?
Der SQL-Standard § 8.2 beschreibt, wie =
Zeichenfolgen verglichen werden:
Der Vergleich zweier Zeichenketten wird wie folgt bestimmt:
a) Wenn die Länge in Zeichen von X nicht gleich der Länge in Zeichen von Y ist, wird die kürzere Zeichenfolge zu Vergleichszwecken effektiv durch eine Kopie von sich selbst ersetzt, die auf die Länge der längeren Zeichenfolge erweitert wurde durch Verkettung rechts von einem oder mehreren Pad-Zeichen, wobei das Pad-Zeichen basierend auf CS ausgewählt wird. Wenn CS das NO PAD-Attribut hat, ist das Pad-Zeichen ein implementierungsabhängiges Zeichen, das sich von jedem Zeichen im Zeichensatz von X und Y unterscheidet, das weniger als jede Zeichenfolge unter CS sortiert. Andernfalls ist das Pad-Zeichen a.
b) Das Ergebnis des Vergleichs von X und Y ergibt sich aus der Sortierfolge CS.
c) Abhängig von der Sortierfolge können zwei Zeichenfolgen als gleich verglichen werden, auch wenn sie unterschiedlich lang sind oder unterschiedliche Zeichenfolgen enthalten. Wenn die Operationen MAX, MIN, DISTINCT, Verweise auf eine Gruppierungsspalte und die Operatoren UNION, EXCEPT und INTERSECT auf Zeichenfolgen verweisen, ist der spezifische Wert, den diese Operationen aus einem Satz solcher gleichen Werte auswählen, implementierungsabhängig.
(Betonung hinzugefügt.)
Was bedeutet das? Dies bedeutet, dass der =
Operator beim Vergleichen von Zeichenfolgen nur ein dünner Wrapper um die aktuelle Sortierung ist. Eine Kollatierung ist eine Bibliothek, die verschiedene Regeln zum Vergleichen von Zeichenfolgen enthält. Hier ist ein Beispiel für eine binäre Zusammenstellung von MySQL :
static int my_strnncoll_binary(const CHARSET_INFO *cs __attribute__((unused)),
const uchar *s, size_t slen,
const uchar *t, size_t tlen,
my_bool t_is_prefix)
{
size_t len= MY_MIN(slen,tlen);
int cmp= memcmp(s,t,len);
return cmp ? cmp : (int)((t_is_prefix ? len : slen) - tlen);
}
Diese bestimmte Kollatierung vergleicht Byte für Byte (weshalb sie "binär" genannt wird - sie gibt Zeichenfolgen keine besondere Bedeutung). Andere Kollatierungen bieten möglicherweise erweiterte Vergleiche.
Hier ist beispielsweise eine UTF-8-Kollatierung , die Vergleiche ohne Berücksichtigung der Groß- und Kleinschreibung unterstützt. Der Code ist zu lang, um ihn hier einzufügen, aber gehen Sie zu diesem Link und lesen Sie den Text von my_strnncollsp_utf8mb4()
. Diese Sortierung kann mehrere Bytes gleichzeitig verarbeiten und verschiedene Transformationen anwenden (z. B. Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung). Der =
Operator ist vollständig von den Launen der Kollatierung abstrahiert.
Wie funktioniert das LIKE
?
Der SQL-Standard § 8.5 beschreibt, wie LIKE
Zeichenfolgen verglichen werden:
Das <Prädikat>
M LIKE P
ist wahr, wenn es eine Aufteilung von M in Teilzeichenfolgen gibt, so dass:
i) Eine Teilzeichenfolge von M ist eine Folge von 0 oder mehr zusammenhängenden <Zeichenrepräsentationen> s von M, und jede <Zeichenrepräsentation> von M ist Teil genau einer Teilzeichenfolge.
ii) Wenn der i-te Teilstringspezifizierer von P ein beliebiger Zeichenspezifizierer ist, ist der i-te Teilstringspezifizierer von M eine einzelne <Zeichenrepräsentation>.
iii) Wenn der i-te Teilstringspezifizierer von P ein beliebiger Zeichenkettenspezifizierer ist, dann ist der i-te Teilstringspezifizierer von M eine beliebige Folge von 0 oder mehr <Zeichendarstellung> s.
iv) Wenn der i-te Teilzeichenfolgenspezifizierer von P weder ein beliebiger Zeichenspezifizierer noch ein beliebiger Zeichenfolgenspezifizierer ist, dann ist der i-te Teilzeichenfolgenspezifizierer von M gleich diesem Teilzeichenfolgenspezifizierer gemäß der Sortierfolge des <ähnlichen Prädikats> ohne das Anhängen von <Leerzeichen> an M und hat die gleiche Länge wie dieser Teilstring-Bezeichner.
v) Die Anzahl der Teilzeichenfolgen von M entspricht der Anzahl der Teilzeichenfolgenspezifizierer von P.
(Betonung hinzugefügt.)
Das ist ziemlich wortreich, also lasst es uns zusammenfassen. Artikel II und III beziehen sich auf die Platzhalter _
und %
, respectively. Wenn P
keine Platzhalter enthalten sind, gilt nur Punkt iv. Dies ist der Fall von Interesse, das vom OP gestellt wird.
In diesem Fall wird jeder "Teilstring" (einzelne Zeichen) mit M
jedem Teilstring unter P
Verwendung der aktuellen Sortierung verglichen .
Schlussfolgerungen
Die Quintessenz ist, dass beim Vergleichen von Zeichenfolgen =
die gesamte Zeichenfolge verglichen wird, während jeweils LIKE
ein Zeichen verglichen wird. Beide Vergleiche verwenden die aktuelle Sortierung. Dieser Unterschied führt in einigen Fällen zu unterschiedlichen Ergebnissen, wie das erste Beispiel in diesem Beitrag zeigt.
Welches solltest du verwenden? Niemand kann Ihnen das sagen - Sie müssen diejenige verwenden, die für Ihren Anwendungsfall richtig ist. Optimieren Sie nicht vorzeitig, indem Sie die Vergleichsoperatoren wechseln.