Hier sind drei Optionen für die Rückgabe von Zeilen, die in MySQL Kleinbuchstaben enthalten.
Beispieldaten
Angenommen, wir haben eine Tabelle mit den folgenden Daten:
SELECT c1 FROM t1;
Ergebnis:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | café | | 1café | | eCafé | | James Bond 007 | | JB 007 | | 007 | | NULL | | | | É | | É 123 | | é | | é 123 | | ø | | Ø | +----------------+
Wir können die folgenden Methoden verwenden, um die Zeilen zurückzugeben, die Kleinbuchstaben enthalten.
Option 1:Vergleiche mit UPPER()
Zeichenkette
Wir können den UPPER()
verwenden Funktion, um den ursprünglichen Wert mit seinem Äquivalent in Großbuchstaben zu vergleichen:
SELECT c1 FROM t1
WHERE CAST(UPPER(c1) AS BINARY) <> CAST(c1 AS BINARY);
Ergebnis:
+----------------+ | c1 | +----------------+ | Café | | café | | 1café | | eCafé | | James Bond 007 | | é | | é 123 | | ø | +----------------+
Durch die Verwendung von ungleich (<>
) Operator (Sie können alternativ !=
verwenden statt <>
Wenn Sie möchten), geben wir nur die Zeilen zurück, die sich von ihren Entsprechungen in Großbuchstaben unterscheiden. Der Grund dafür ist, dass, wenn ein Wert mit seinem Äquivalent in Großbuchstaben identisch ist, er bereits von Anfang an in Großbuchstaben war (und wir ihn nicht zurückgeben möchten).
Standardmäßig führt MySQL eine Suche ohne Berücksichtigung der Groß-/Kleinschreibung durch, daher verwende ich CAST()
Funktion, um die Werte in Binär umzuwandeln, um eine Suche mit Berücksichtigung der Groß-/Kleinschreibung zu erhalten.
Es ist auch möglich, den BINARY
zu verwenden -Operator, um den Wert in Binär umzuwandeln, aber dieser Operator ist seit MySQL 8.0.27 veraltet und könnte in einer zukünftigen Version entfernt werden.
In jedem Fall sieht der Code so aus, wenn der BINARY
verwendet wird Betreiber:
SELECT c1 FROM t1
WHERE BINARY UPPER(c1) <> BINARY c1;
Es kann auch so gemacht werden:
SELECT c1 FROM t1
WHERE BINARY(UPPER(c1)) <> BINARY(c1);
Hier sind die Ergebnisse, die ich von beiden erhalte, wenn ich den Code in MySQL 8.0.27 ausführe:
+----------------+ | c1 | +----------------+ | Café | | café | | 1café | | eCafé | | James Bond 007 | | é | | é 123 | | ø | +----------------+
Und wenn ich die Warnungen zeige:
SHOW WARNINGS;
Ergebnis:
+---------+------+----------------------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------------------------------------------------------------+ | Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead | | Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead | +---------+------+----------------------------------------------------------------------------------------------+
Option 2:Mit den tatsächlichen Zeichen vergleichen
Eine andere Möglichkeit ist die Verwendung des REGEXP
Operator mit einem regulären Ausdrucksmuster, das explizit jeden Kleinbuchstaben enthält, den wir abgleichen möchten:
SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[abcdefghijklmnopqrstuvwxyz]' AS BINARY);
Ergebnis:
+----------------+ | c1 | +----------------+ | Café | | café | | 1café | | eCafé | | James Bond 007 | +----------------+
Diesmal werden weniger Zeilen zurückgegeben als in den vorherigen Beispielen. Das liegt daran, dass ich keine Zeichen wie é
angegeben habe und ø
, die in diesen Beispielen zurückgegeben wurden. Unser Ergebnis enthält é
aber diese Zeile wurde nur zurückgegeben, weil sie auch andere Kleinbuchstaben enthält, die tun übereinstimmen.
Daher müssen Sie sicherstellen, dass alle gültigen Zeichen abgedeckt sind, wenn Sie diese Option verwenden.
Option 3:Mit einer Reihe von Zeichen vergleichen
Eine andere Möglichkeit besteht darin, den Zeichenbereich anzugeben, den wir abgleichen möchten:
SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[a-z]' AS BINARY);
Ergebnis:
+----------------+ | c1 | +----------------+ | Café | | café | | 1café | | eCafé | | James Bond 007 | +----------------+