Poniżej znajdują się dwie opcje wyszukiwania wierszy zawierających tylko znaki niealfanumeryczne w MySQL.
Znaki inne niż alfanumeryczne obejmują znaki interpunkcyjne, takie jak [email protected]#&()–[{}]:;',?/*
i symbole takie jak `~$^+=<>“
, a także znaki odstępu, takie jak spacja lub tabulatory.
Przykładowe dane
W naszych przykładach użyjemy następujących danych:
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;
Wynik:
+----------------------+ | 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 | +----------------------+
Opcja 1:Porównaj z [:alnum:]
Możemy użyć REGEXP
MySQL operator, aby porównać naszą kolumnę z wyrażeniem regularnym.
Możliwości wyrażeń regularnych MySQL obejmują obsługę klas znaków POSIX. Dlatego możemy użyć [:alnum:]
Klasa znaków POSIX w naszych wyrażeniach regularnych, aby znaleźć wiersze zawierające tylko znaki alfanumeryczne, a następnie zanegować to za pomocą NOT
operatora.
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[[:alnum:]]';
Wynik:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | +----------------------+
Jeśli chcesz wykluczyć określony znak, zawsze możesz użyć NULLIF()
funkcjonować.
Na przykład wykluczmy pusty ciąg z ostatniego wiersza:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';
Wynik:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | +----------------------+
Opcja 2:Określ zakres znaków
Innym sposobem na to jest określenie zakresu znaków w wyrażeniu regularnym.
Przykład:
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[A-Za-z0-9]';
Wynik:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | | | é | | É | | ø | +----------------------+
Aby usunąć pusty ciąg:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';
Wynik:
+----------------------+ | c1 | +----------------------+ | () | | [email protected]#&()–[{}]:;',?/* | | `~$^+=<>“ | | é | | É | | ø | +----------------------+
W tym przypadku mój zakres wykluczeń nie obejmował znaków alfanumerycznych, takich jak é
, É
i ø
, a więc dane wyjściowe nie są prawdziwą reprezentacją znaków niealfanumerycznych. To powiedziawszy, przynajmniej ta metoda daje możliwość określenia dokładnych znaków, które chcesz uwzględnić lub wykluczyć z wyniku.
Alternatywy dla REGEXP
W MySQL RLIKE
i REGXP
operatory są synonimami dla REGEXP_LIKE()
. Dlatego możemy zastąpić dowolny z poprzednich przykładów przez NOT RLIKE
lub NOT REGEXP_LIKE()
.
Przykład RLIKE
:
SELECT c1 FROM t1
WHERE c1 NOT RLIKE '[[:alnum:]]';
Przykład REGEXP_LIKE()
:
SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');