Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

3 maneiras de encontrar linhas que contêm letras minúsculas no MySQL


Aqui estão três opções para retornar linhas que contêm caracteres minúsculos no MySQL.

Dados de amostra


Suponha que temos uma tabela com os seguintes dados:
SELECT c1 FROM t1;

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

Podemos usar os seguintes métodos para retornar as linhas que contêm letras minúsculas.

Opção 1:Compare com o UPPER() Cadeia


Podemos usar o UPPER() função para comparar o valor original com seu equivalente em maiú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 o diferente de (<> ) (você pode usar alternativamente != em vez de <> se preferir), apenas retornamos as linhas que são diferentes de seus equivalentes em maiúsculas. A razão pela qual fazemos isso é porque, se um valor é o mesmo que seu equivalente em maiúsculas, então já era em maiúsculas (e não queremos devolvê-lo).

Por padrão, o MySQL realiza uma pesquisa que não diferencia maiúsculas de minúsculas e, portanto, uso o CAST() função para converter os valores em binário para obter uma pesquisa com distinção entre maiúsculas e minúsculas.

Também é possível usar o BINARY para converter o valor em binário, mas este operador está obsoleto a partir do MySQL 8.0.27 e pode ser removido em uma versão futura.

De qualquer forma, é assim que o código se parece ao usar o BINARY operador:
SELECT c1 FROM t1
WHERE BINARY UPPER(c1) <> BINARY c1;

Também pode ser feito assim:
SELECT c1 FROM t1
WHERE BINARY(UPPER(c1)) <> BINARY(c1);

Aqui estão os resultados que recebo de ambos ao executar o código no MySQL 8.0.27:
+----------------+
| c1             |
+----------------+
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| é              |
| é 123          |
| ø              |
+----------------+

E quando eu mostro os avisos:
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 |
+---------+------+----------------------------------------------------------------------------------------------+

Opção 2:comparar com os caracteres reais


Outra opção é usar o REGEXP operador com um padrão de expressão regular que inclui explicitamente cada caractere minúsculo que queremos corresponder:
SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[abcdefghijklmnopqrstuvwxyz]' AS BINARY);

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

Desta vez, menos linhas são retornadas do que nos exemplos anteriores. Isso porque não especifiquei caracteres como é e ø , que foram retornados nesses exemplos. Nosso resultado contém é mas essa linha só foi retornada porque também contém outros caracteres minúsculos que fazem partida.

Portanto, você precisará garantir que todos os caracteres válidos sejam cobertos se usar essa opção.

Opção 3:comparar com um intervalo de caracteres


Outra maneira de fazer isso é especificar o intervalo de caracteres que queremos corresponder:
SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[a-z]' AS BINARY);

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