Di seguito sono riportate due opzioni per trovare quelle righe che contengono solo caratteri non alfanumerici in MySQL.
I caratteri non alfanumerici includono segni di punteggiatura come [email protected]#&()–[{}]:;',?/*
e simboli come `~$^+=<>“
, oltre a spazi bianchi come spazi o caratteri di tabulazione.
Dati di esempio
Utilizzeremo i seguenti dati per i nostri esempi:
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;
Risultato:
+----------------------+ | 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 | +----------------------+
Opzione 1:confronta con [:alnum:]
Possiamo usare REGEXP
di MySQL per confrontare la nostra colonna con un'espressione regolare.
La capacità di espressione regolare di MySQL include il supporto per le classi di caratteri POSIX. Pertanto, possiamo usare il [:alnum:]
classe di caratteri POSIX nelle nostre espressioni regolari per trovare le righe che contengono solo caratteri alfanumerici, quindi negarlo con NOT
operatore.
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[[:alnum:]]';
Risultato:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | +----------------------+
Se devi escludere un carattere specifico, puoi sempre utilizzare il NULLIF()
funzione.
Ad esempio, escludiamo la stringa vuota dall'ultima riga:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';
Risultato:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | +----------------------+
Opzione 2:specifica un intervallo di caratteri
Un altro modo per farlo è specificare un intervallo di caratteri all'interno dell'espressione regolare.
Esempio:
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[A-Za-z0-9]';
Risultato:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | | é | | É | | ø | +----------------------+
E per rimuovere la stringa vuota:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';
Risultato:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | é | | É | | ø | +----------------------+
In questo caso, il mio intervallo di esclusione non copriva i caratteri alfanumerici come é
, É
e ø
, e quindi l'output non è una vera rappresentazione di caratteri non alfanumerici. Detto questo, almeno questo metodo ti dà la possibilità di specificare i caratteri esatti che desideri includere o escludere dal risultato.
Alternative a REGEXP
In MySQL, il RLIKE
e REGXP
gli operatori sono sinonimi di REGEXP_LIKE()
. Pertanto, possiamo sostituire uno qualsiasi degli esempi precedenti con NOT RLIKE
o NOT REGEXP_LIKE()
.
Esempio di RLIKE
:
SELECT c1 FROM t1
WHERE c1 NOT RLIKE '[[:alnum:]]';
Esempio di REGEXP_LIKE()
:
SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');