По-долу са две опции за намиране на тези редове, които съдържат буквено-цифрови знаци в MySQL.
Буквено-цифровите знаци са букви и цифри.
Примерни данни
Ще използваме следните данни за нашите примери:
CREATE TABLE t1 (
c1 varchar(255) NULL
);
INSERT INTO t1 VALUES
('Music'),
('Live Music'),
('Café'),
('Café Del Mar'),
('100 Cafés'),
('example@sqldat.com'),
('1 + 1'),
('()'),
('example@sqldat.com#&()–[{}]:;'',?/*'),
('`~$^+=<>“'),
('$1.50'),
('Player 456'),
('007'),
(null),
(''),
('é'),
('É'),
('é 123'),
('ø'),
('ø 123');
SELECT c1 FROM t1; Резултат:
+----------------------+
| c1 |
+----------------------+
| Music |
| Live Music |
| Café |
| Café Del Mar |
| 100 Cafés |
| example@sqldat.com |
| 1 + 1 |
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
| $1.50 |
| Player 456 |
| 007 |
| NULL |
| |
| é |
| É |
| é 123 |
| ø |
| ø 123 |
+----------------------+ Опция 1:Сравнете с [:alnum:]
Можем да използваме REGEXP на MySQL оператор, за да сравните нашата колона с регулярен израз.
Възможността за регулярни изрази на MySQL включва поддръжка за POSIX символните класове. Следователно можем да използваме [:alnum:] POSIX символен клас в нашите регулярни изрази, за да намерите редовете, които съдържат буквено-цифрови знаци.
SELECT c1 FROM t1
WHERE c1 REGEXP '^[[:alnum:]]+$'; Резултат:
+-------+ | c1 | +-------+ | Music | | Café | | 007 | | é | | É | | ø | +-------+
Това върна само онези редове, които не съдържат нищо освен буквено-цифрови знаци. Ако един ред съдържа както буквено-цифрови, така и не-буквени знаци, той не се връща.
Знакът за интервал се счита за небуквенно-цифров и така, ако искаме да включим интервали, можем да направим това:
SELECT c1 FROM t1
WHERE c1 REGEXP '^[[:alnum:] ]+$'; Резултат:
+---------------+ | c1 | +---------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | Player 456 | | 007 | | é | | É | | é 123 | | ø | | ø 123 | +---------------+
За да върнете всички редове, които съдържат буквено-цифрови знаци (дори редът да съдържа и не-буквени знаци), можем да направим това:
SELECT c1 FROM t1
WHERE c1 REGEXP '[[:alnum:]]'; Резултат:
+-------------------+ | c1 | +-------------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | example@sqldat.com | | 1 + 1 | | $1.50 | | Player 456 | | 007 | | é | | É | | é 123 | | ø | | ø 123 | +-------------------+
Опция 2:Посочете диапазон от знаци
Друг начин да го направите е да предоставите регулярен израз, който предоставя набор от знаци. Все още можем да използваме REGEXP оператор, за да направи това.
Пример:
SELECT c1 FROM t1
WHERE c1 REGEXP '^[A-Za-z0-9]+$'; Резултат:
+-------+ | c1 | +-------+ | Music | | 007 | +-------+
Това върна по-малко редове, отколкото с първия ни пример. Това е, защото не включих é , É , или ø символи в моя диапазон и така всички редове, които съдържат тези знаци, са изключени от изхода.
Ето защо ще трябва да бъдете внимателни, когато използвате този метод, в случай че случайно изключите знаци, които трябва да включите.
Въпреки това, в съответствие с този диапазон, можем да включим интервали като това:
SELECT c1 FROM t1
WHERE c1 REGEXP '^[A-Za-z0-9 ]+$'; Резултат:
+------------+ | c1 | +------------+ | Music | | Live Music | | Player 456 | | 007 | +------------+
И можем да използваме следното, за да включим всички редове, които съдържат знаци от нашия диапазон (дори и те да съдържат знаци извън този диапазон):
SELECT c1 FROM t1
WHERE c1 REGEXP '[A-Za-z0-9]'; Резултат:
+-------------------+ | c1 | +-------------------+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | example@sqldat.com | | 1 + 1 | | $1.50 | | Player 456 | | 007 | | é 123 | | ø 123 | +-------------------+
Алтернативи на REGEXP
В MySQL, RLIKE и REGXP операторите са синоними за REGEXP_LIKE() . Следователно можем да заменим всеки от предишните примери с RLIKE или REGEXP_LIKE() .
Пример за RLIKE :
SELECT c1 FROM t1
WHERE c1 RLIKE '^[[:alnum:]]+$';
Пример за REGEXP_LIKE() :
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');