Abaixo estão duas opções para encontrar as linhas que contêm apenas caracteres não alfanuméricos no MySQL.
Caracteres não alfanuméricos incluem caracteres de pontuação como
example@sqldat.com#&()–[{}]:;',?/* e símbolos como `~$^+=<>“ , bem como caracteres de espaço em branco, como os caracteres de espaço ou tabulação. Dados de amostra
Usaremos os seguintes dados para nossos exemplos:
CREATE TABLE t1 (
c1 varchar(255) NULL
);
INSERT INTO t1 VALUES
('Music'),
('Live Music'),
('Café'),
('Café Del Mar'),
('100 Cafés'),
('example@sqldat.com'),
('1 + 1'),
('()'),
('example@sqldat.com#&()–[{}]:;'',?/*'),
('`~$^+=<>“'),
('$1.50'),
('Player 456'),
('007'),
(null),
(''),
('é'),
('É'),
('é 123'),
('ø'),
('ø 123');
SELECT c1 FROM t1; Resultado:
+----------------------+
| c1 |
+----------------------+
| Music |
| Live Music |
| Café |
| Café Del Mar |
| 100 Cafés |
| example@sqldat.com |
| 1 + 1 |
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
| $1.50 |
| Player 456 |
| 007 |
| NULL |
| |
| é |
| É |
| é 123 |
| ø |
| ø 123 |
+----------------------+ Opção 1:Comparar com [:alnum:]
Podemos usar o
REGEXP do MySQL operador para comparar nossa coluna com uma expressão regular. A capacidade de expressão regular do MySQL inclui suporte para as classes de caracteres POSIX. Portanto, podemos usar o
[:alnum:] classe de caracteres POSIX em nossas expressões regulares para encontrar as linhas que contêm apenas caracteres alfanuméricos e, em seguida, negue isso com o NOT operador. SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[[:alnum:]]'; Resultado:
+----------------------+
| c1 |
+----------------------+
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
| |
+----------------------+ Se você precisar excluir um caractere específico, sempre poderá usar o
NULLIF() função. Por exemplo, vamos excluir a string vazia da última linha:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]'; Resultado:
+----------------------+
| c1 |
+----------------------+
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
+----------------------+ Opção 2:especificar um intervalo de caracteres
Outra maneira de fazer isso é especificar um intervalo de caracteres em sua expressão regular.
Exemplo:
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[A-Za-z0-9]'; Resultado:
+----------------------+
| c1 |
+----------------------+
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
| |
| é |
| É |
| ø |
+----------------------+ E para remover a string vazia:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]'; Resultado:
+----------------------+
| c1 |
+----------------------+
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
| é |
| É |
| ø |
+----------------------+ Nesse caso, meu intervalo de exclusão não abrangeu caracteres alfanuméricos como
é , É , e ø e, portanto, a saída não é uma representação verdadeira de caracteres não alfanuméricos. Dito isso, pelo menos esse método oferece a opção de especificar os caracteres exatos que você deseja incluir ou excluir do resultado. Alternativas para REGEXP
No MySQL, o
RLIKE e REGXP operadores são sinônimos de REGEXP_LIKE() . Portanto, podemos substituir qualquer um dos exemplos anteriores por NOT RLIKE ou NOT REGEXP_LIKE() . Exemplo de
RLIKE :SELECT c1 FROM t1
WHERE c1 NOT RLIKE '[[:alnum:]]'; Exemplo de
REGEXP_LIKE() :SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');