sql >> Base de Datos >  >> RDS >> Mysql

3 formas de encontrar filas que contienen letras minúsculas en MySQL

Aquí hay tres opciones para devolver filas que contienen caracteres en minúsculas en MySQL.

Datos de muestra

Supongamos que tenemos una tabla con los siguientes datos:

SELECT c1 FROM t1;

Resultado:

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

Podemos usar los siguientes métodos para devolver las filas que contienen letras minúsculas.

Opción 1:comparar con UPPER() Cadena

Podemos usar UPPER() función para comparar el valor original con su equivalente en mayúsculas:

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

Resultado:

+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| é              |
| é 123          |
| ø              |
+----------------+

Usando el no igual a (<> ) operador (alternativamente, puede usar != en lugar de <> si lo prefiere), solo devolvemos aquellas filas que son diferentes a sus equivalentes en mayúsculas. La razón por la que hacemos esto es porque, si un valor es igual a su equivalente en mayúsculas, para empezar ya estaba en mayúsculas (y no queremos devolverlo).

De forma predeterminada, MySQL realiza una búsqueda que no distingue entre mayúsculas y minúsculas, por lo que uso el CAST() función para convertir los valores a binario para obtener una búsqueda que distinga entre mayúsculas y minúsculas.

También es posible usar el BINARY operador para convertir el valor en binario, pero este operador está obsoleto a partir de MySQL 8.0.27 y podría eliminarse en una versión futura.

En cualquier caso, así es como se ve el código cuando se usa BINARY operador:

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

También se puede hacer así:

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

Estos son los resultados que obtengo de ambos cuando ejecuto el código en MySQL 8.0.27:

+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| é              |
| é 123          |
| ø              |
+----------------+

Y cuando muestro las advertencias:

SHOW WARNINGS;

Resultado:

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

Opción 2:comparar con los caracteres reales

Otra opción es usar el REGEXP operador con un patrón de expresión regular que incluye explícitamente cada carácter en minúscula que queremos hacer coincidir:

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

Resultado:

+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

Esta vez se devuelven menos filas que en los ejemplos anteriores. Eso es porque no especifiqué caracteres como é y ø , que se devolvieron en esos ejemplos. Nuestro resultado contiene é pero esa fila solo se devolvió porque también contiene otros caracteres en minúscula que do partido.

Por lo tanto, deberá asegurarse de tener cubiertos todos los caracteres válidos si usa esta opción.

Opción 3:comparar con un rango de caracteres

Otra forma de hacerlo es especificar el rango de caracteres que queremos hacer coincidir:

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

Resultado:

+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+