Nedenfor er der to muligheder for at finde de rækker, der kun indeholder ikke-alfanumeriske tegn i MySQL.
Ikke-alfanumeriske tegn inkluderer tegnsætningstegn såsom [email protected]#&()–[{}]:;',?/*
og symboler som `~$^+=<>“
, såvel som mellemrumstegn som mellemrum eller tabulatortegn.
Eksempel på data
Vi bruger følgende data til vores eksempler:
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;
Resultat:
+----------------------+ | 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 | +----------------------+
Mulighed 1:Sammenlign med [:alnum:]
Vi kan bruge MySQL's REGEXP
operator for at sammenligne vores kolonne med et regulært udtryk.
MySQLs regulære udtryksevne inkluderer understøttelse af POSIX-tegnklasserne. Derfor kan vi bruge [:alnum:]
POSIX-tegnklasse i vores regulære udtryk for at finde de rækker, der kun indeholder alfanumeriske tegn, og afvis derefter det med NOT
operatør.
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[[:alnum:]]';
Resultat:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | +----------------------+
Hvis du har brug for at udelukke et bestemt tegn, kan du altid bruge NULLIF()
fungere.
Lad os f.eks. ekskludere den tomme streng fra den sidste række:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';
Resultat:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | +----------------------+
Mulighed 2:Angiv en række af tegn
En anden måde at gøre det på er at angive en række tegn i dit regulære udtryk.
Eksempel:
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[A-Za-z0-9]';
Resultat:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | | é | | É | | ø | +----------------------+
Og for at fjerne den tomme streng:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';
Resultat:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | é | | É | | ø | +----------------------+
I dette tilfælde dækkede mit ekskluderingsområde ikke alfanumeriske tegn som é
, É
og ø
, og outputtet er derfor ikke en sand repræsentation af ikke-alfanumeriske tegn. Når det er sagt, giver denne metode dig i det mindste mulighed for at angive de nøjagtige tegn, du vil inkludere eller udelukke fra resultatet.
Alternativer til REGEXP
I MySQL er RLIKE
og REGXP
operatorer er synonymer for REGEXP_LIKE()
. Derfor kan vi erstatte et hvilket som helst af de foregående eksempler med NOT RLIKE
eller NOT REGEXP_LIKE()
.
Eksempel på RLIKE
:
SELECT c1 FROM t1
WHERE c1 NOT RLIKE '[[:alnum:]]';
Eksempel på REGEXP_LIKE()
:
SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');