Nedan finns två alternativ för att hitta de rader som bara innehåller icke-alfanumeriska tecken i MySQL.
Icke-alfanumeriska tecken inkluderar skiljetecken som [email protected]#&()–[{}]:;',?/*
och symboler som `~$^+=<>“
, såväl som blanksteg som blanksteg eller tabbtecken.
Exempeldata
Vi använder följande data för våra exempel:
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 | +----------------------+
Alternativ 1:Jämför med [:alnum:]
Vi kan använda MySQL:s REGEXP
operatorn för att jämföra vår kolumn med ett reguljärt uttryck.
MySQL:s kapacitet för reguljära uttryck inkluderar stöd för POSIX-teckenklasserna. Därför kan vi använda [:alnum:]
POSIX-teckenklass i våra reguljära uttryck för att hitta de rader som bara innehåller alfanumeriska tecken, förneka sedan det med NOT
operatör.
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[[:alnum:]]';
Resultat:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | +----------------------+
Om du behöver utesluta ett specifikt tecken kan du alltid använda NULLIF()
fungera.
Låt oss till exempel utesluta den tomma strängen från den sista raden:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';
Resultat:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | +----------------------+
Alternativ 2:Ange ett antal tecken
Ett annat sätt att göra det är att ange ett antal tecken i ditt reguljära uttryck.
Exempel:
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[A-Za-z0-9]';
Resultat:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | | é | | É | | ø | +----------------------+
Och för att ta bort den tomma strängen:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';
Resultat:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | é | | É | | ø | +----------------------+
I det här fallet täckte inte mitt uteslutningsintervall alfanumeriska tecken som é
, É
och ø
, och så utdata är inte en sann representation av icke-alfanumeriska tecken. Som sagt, åtminstone den här metoden ger dig möjlighet att ange exakt de tecken du vill inkludera eller utesluta från resultatet.
Alternativ till REGEXP
I MySQL, RLIKE
och REGXP
operatorer är synonymer för REGEXP_LIKE()
. Därför kan vi ersätta vilket som helst av de tidigare exemplen med NOT RLIKE
eller NOT REGEXP_LIKE()
.
Exempel på RLIKE
:
SELECT c1 FROM t1
WHERE c1 NOT RLIKE '[[:alnum:]]';
Exempel på REGEXP_LIKE()
:
SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');