Poniżej znajdują się dwie opcje wyszukiwania wierszy zawierających znaki alfanumeryczne w MySQL.
Znaki alfanumeryczne to znaki alfabetu i znaki numeryczne.
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 do znajdowania wierszy zawierających znaki alfanumeryczne.
SELECT c1 FROM t1
WHERE c1 REGEXP '^[[:alnum:]]+$';
Wynik:
+-------+ | c1 | +-------+ | Music | | Café | | 007 | | é | | É | | ø | +-------+
To zwróciło tylko te wiersze, które zawierają tylko znaki alfanumeryczne. Jeśli wiersz zawiera zarówno znaki alfanumeryczne, jak i niealfanumeryczne, nie jest on zwracany.
Znak spacji jest uważany za niealfanumeryczny, więc jeśli chcemy uwzględnić spacje, możemy to zrobić:
SELECT c1 FROM t1
WHERE c1 REGEXP '^[[:alnum:] ]+$';
Wynik:
+---------------+ | c1 | +---------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | Player 456 | | 007 | | é | | É | | é 123 | | ø | | ø 123 | +---------------+
Aby zwrócić wszystkie wiersze, które zawierają znaki alfanumeryczne (nawet jeśli wiersz zawiera również znaki niealfanumeryczne), możemy to zrobić:
SELECT c1 FROM t1
WHERE c1 REGEXP '[[:alnum:]]';
Wynik:
+-------------------+ | c1 | +-------------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | $1.50 | | Player 456 | | 007 | | é | | É | | é 123 | | ø | | ø 123 | +-------------------+
Opcja 2:Określ zakres znaków
Innym sposobem na to jest dostarczenie wyrażenia regularnego, które zawiera szereg znaków. Nadal możemy używać REGEXP
operatora, aby to zrobić.
Przykład:
SELECT c1 FROM t1
WHERE c1 REGEXP '^[A-Za-z0-9]+$';
Wynik:
+-------+ | c1 | +-------+ | Music | | 007 | +-------+
Zwróciło to mniej wierszy niż w naszym pierwszym przykładzie. To dlatego, że nie dodałem é
, É
lub ø
znaków w moim zakresie, więc wszystkie wiersze zawierające te znaki są wykluczane z danych wyjściowych.
Dlatego musisz zachować ostrożność podczas korzystania z tej metody, na wypadek przypadkowego wykluczenia znaków, które powinieneś uwzględnić.
Jednak trzymając się tego zakresu, możemy uwzględnić spacje takie jak:
SELECT c1 FROM t1
WHERE c1 REGEXP '^[A-Za-z0-9 ]+$';
Wynik:
+------------+ | c1 | +------------+ | Music | | Live Music | | Player 456 | | 007 | +------------+
Możemy użyć poniższych, aby uwzględnić wszystkie wiersze, które zawierają znaki z naszego zakresu (nawet jeśli zawierają również znaki spoza tego zakresu):
SELECT c1 FROM t1
WHERE c1 REGEXP '[A-Za-z0-9]';
Wynik:
+-------------------+ | c1 | +-------------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | $1.50 | | Player 456 | | 007 | | é 123 | | ø 123 | +-------------------+
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 RLIKE
lub REGEXP_LIKE()
.
Przykład RLIKE
:
SELECT c1 FROM t1
WHERE c1 RLIKE '^[[:alnum:]]+$';
Przykład REGEXP_LIKE()
:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');