Mysql
 sql >> Base de données >  >> RDS >> Mysql

3 façons de trouver des lignes contenant des lettres majuscules dans MySQL

Voici trois options pour renvoyer des lignes contenant des caractères majuscules dans MySQL.

Exemple de données

Supposons que nous ayons un tableau avec les données suivantes :

SELECT c1 FROM t1;

Résultat :

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

Nous pouvons utiliser les méthodes suivantes pour renvoyer les lignes contenant des lettres majuscules.

Option 1 :Comparer avec LOWER() Chaîne

Nous pouvons utiliser le LOWER() fonction pour comparer la valeur d'origine à son équivalent en minuscule :

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

Résultat :

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

En utilisant le différent de (<> ) opérateur (vous pouvez également utiliser != au lieu de <> si vous préférez), nous renvoyons uniquement les lignes qui sont différentes de leurs équivalents en minuscules. La raison pour laquelle nous faisons cela est que, si une valeur est identique à son équivalent en minuscules, alors elle était déjà en minuscules au départ (et nous ne voulons pas la renvoyer).

Par défaut, MySQL effectue une recherche insensible à la casse, et j'utilise donc le CAST() pour convertir les valeurs en binaire afin d'obtenir une recherche sensible à la casse.

Il est également possible d'utiliser le BINARY pour convertir la valeur en binaire, mais cet opérateur est obsolète depuis MySQL 8.0.27 et il pourrait être supprimé dans une future version.

Dans tous les cas, voici à quoi ressemble le code lors de l'utilisation du BINARY opérateur :

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

Cela peut aussi être fait comme ceci :

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

Voici les résultats que j'obtiens des deux lors de l'exécution du code dans MySQL 8.0.27 :

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

Et quand j'affiche les avertissements :

SHOW WARNINGS;

Résultat :

+---------+------+----------------------------------------------------------------------------------------------+
| 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 : Comparer avec les caractères réels

Une autre option consiste à utiliser le REGEXP opérateur avec un modèle d'expression régulière qui inclut explicitement chaque caractère majuscule que nous voulons faire correspondre :

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

Résultat :

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

Cette fois, moins de lignes sont renvoyées que dans les exemples précédents. C'est parce que je n'ai pas spécifié de caractères comme É et Ø , qui ont été renvoyés dans ces exemples. Notre résultat contient É mais cette ligne n'a été renvoyée que parce qu'elle contient également d'autres caractères majuscules qui font correspondance.

Par conséquent, vous devrez vous assurer que tous les caractères valides sont couverts si vous utilisez cette option.

Option 3 :Comparer à une plage de caractères

Une autre façon de le faire est de spécifier la plage de caractères majuscules que nous voulons faire correspondre :

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

Résultat :

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