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
[email protected]#&()–[{}]:;',?/*
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'),
('[email protected]'),
('1 + 1'),
('()'),
('[email protected]#&()–[{}]:;'',?/*'),
('`~$^+=<>“'),
('$1.50'),
('Player 456'),
('007'),
(null),
(''),
('é'),
('É'),
('é 123'),
('ø'),
('ø 123');
SELECT c1 FROM t1;
Resultado:
+----------------------+ | c1 | +----------------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | $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 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | +----------------------+
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 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | +----------------------+
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 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | | é | | É | | ø | +----------------------+
E para remover a string vazia:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';
Resultado:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | é | | É | | ø | +----------------------+
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:]]');