Mysql
 sql >> Datenbank >  >> RDS >> Mysql

3 Möglichkeiten, Zeilen zu finden, die Großbuchstaben in MySQL enthalten

Hier sind drei Optionen für die Rückgabe von Zeilen, die in MySQL Großbuchstaben 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 Großbuchstaben enthalten.

Option 1:Vergleichen Sie mit LOWER() Zeichenkette

Wir können den LOWER() verwenden Funktion, um den ursprünglichen Wert mit seinem Äquivalent in Kleinbuchstaben zu vergleichen:

SELECT c1 FROM t1
WHERE CAST(LOWER(c1) AS BINARY) <> CAST(c1 AS BINARY);

Ergebnis:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 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 Kleinbuchstaben-Äquivalenten unterscheiden. Der Grund dafür ist, dass, wenn ein Wert mit seinem kleingeschriebenen Äquivalent identisch ist, er bereits von Anfang an kleingeschrieben 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 LOWER(c1) <> BINARY c1;

Es kann auch so gemacht werden:

SELECT c1 FROM t1
WHERE BINARY(LOWER(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é           |
| eCafé          |
| James Bond 007 |
| JB 007         |
| É              |
| É 123          |
| Ø              |
+----------------+
8 rows in set, 2 warnings (0.00 sec)

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 Großbuchstaben 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é           |
| eCafé          |
| James Bond 007 |
| JB 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 Großbuchstaben 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 Bereich der Großbuchstaben anzugeben, die wir abgleichen möchten:

SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[A-Z]' AS BINARY);

Ergebnis:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
+----------------+