sql >> Database >  >> RDS >> Mysql

3 manieren om rijen met hoofdletters te vinden in MySQL

Hier zijn drie opties voor het retourneren van rijen die hoofdletters bevatten in MySQL.

Voorbeeldgegevens

Stel dat we een tabel hebben met de volgende gegevens:

SELECT c1 FROM t1;

Resultaat:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| JB 007         |
| 007            |
| NULL           |
|                |
| É              |
| É 123          |
| é              |
| é 123          |
| ø              |
| Ø              |
+----------------+

We kunnen de volgende methoden gebruiken om de rijen die hoofdletters bevatten te retourneren.

Optie 1:Vergelijk met de LOWER() Tekenreeks

We kunnen de LOWER() . gebruiken functie om de oorspronkelijke waarde te vergelijken met het equivalent in kleine letters:

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

Resultaat:

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

Door het gebruik van de niet gelijk aan (<> ) operator (u kunt ook != in plaats van <> als je dat liever hebt), retourneren we alleen die rijen die verschillen van hun equivalenten in kleine letters. De reden dat we dit doen is omdat, als een waarde hetzelfde is als het equivalent in kleine letters, het al in kleine letters was (en we willen het niet teruggeven).

MySQL voert standaard een hoofdletterongevoelige zoekopdracht uit, en daarom gebruik ik de CAST() functie om de waarden naar binair te casten om hoofdlettergevoelig te zoeken.

Het is ook mogelijk om de BINARY . te gebruiken operator om de waarde naar binair te casten, maar deze operator is verouderd vanaf MySQL 8.0.27 en kan in een toekomstige release worden verwijderd.

In ieder geval, zo ziet de code eruit bij gebruik van de BINARY operator:

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

Het kan ook als volgt worden gedaan:

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

Dit zijn de resultaten die ik van beide krijg wanneer ik de code in MySQL 8.0.27 uitvoer:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
| É              |
| É 123          |
| Ø              |
+----------------+
8 rows in set, 2 warnings (0.00 sec)

En als ik de waarschuwingen laat zien:

SHOW WARNINGS;

Resultaat:

+---------+------+----------------------------------------------------------------------------------------------+
| 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 |
+---------+------+----------------------------------------------------------------------------------------------+

Optie 2:Vergelijk met de werkelijke karakters

Een andere optie is om de REGEXP . te gebruiken operator met een patroon voor reguliere expressies dat expliciet elk hoofdletter bevat dat we willen matchen:

SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' AS BINARY);

Resultaat:

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

Deze keer worden er minder rijen geretourneerd dan in de vorige voorbeelden. Dat komt omdat ik geen tekens zoals É . heb gespecificeerd en Ø , die in die voorbeelden werden geretourneerd. Ons resultaat bevat É maar die rij werd alleen geretourneerd omdat deze ook andere hoofdletters bevat die doen wedstrijd.

Daarom moet je ervoor zorgen dat alle geldige tekens zijn gedekt als je deze optie gebruikt.

Optie 3:vergelijken met een reeks tekens

Een andere manier om dit te doen is door het bereik van hoofdletters op te geven dat we willen matchen:

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

Resultaat:

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

  1. Breng uw eigen cloud beschikbaar voor DigitalOcean

  2. SQL Server Pre-Login Handshake-bevestigingsfout

  3. Hoe de STRING_ESCAPE()-functie werkt in SQL Server (T-SQL)

  4. Waarom krijg ik alle resultaten als ik een onderstrepingsteken in een LIKE-filter gebruik?