По-долу са две опции за намиране на онези редове, които съдържат само небуквени и цифрови знаци в MySQL.
Небуквени и цифрови знаци включват препинателни знаци като example@sqldat.com#&()–[{}]:;',?/* и символи като `~$^+=<>“ , както и празни знаци като интервалите или табулацията.
Примерни данни
Ще използваме следните данни за нашите примери:
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 символен клас в нашите регулярни изрази, за да намерите редовете, които съдържат само буквено-цифрови знаци, след което отричайте това с NOT оператор.
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[[:alnum:]]'; Резултат:
+----------------------+
| c1 |
+----------------------+
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
| |
+----------------------+
Ако трябва да изключите конкретен знак, винаги можете да използвате NULLIF() функция.
Например, нека изключим празния низ от последния ред:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]'; Резултат:
+----------------------+
| c1 |
+----------------------+
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
+----------------------+ Опция 2:Посочете диапазон от знаци
Друг начин да го направите е да посочите диапазон от знаци във вашия регулярен израз.
Пример:
SELECT c1 FROM t1
WHERE c1 NOT REGEXP '[A-Za-z0-9]'; Резултат:
+----------------------+
| c1 |
+----------------------+
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
| |
| é |
| É |
| ø |
+----------------------+ И за да премахнете празния низ:
SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]'; Резултат:
+----------------------+
| c1 |
+----------------------+
| () |
| example@sqldat.com#&()–[{}]:;',?/* |
| `~$^+=<>“ |
| é |
| É |
| ø |
+----------------------+
В този случай моят диапазон на изключване не обхваща буквено-цифрови знаци като é , É и ø , и така изходът не е истинско представяне на небуквени и цифрови знаци. Въпреки това, поне този метод ви дава възможност да посочите точните знаци, които искате да включите или изключите от резултата.
Алтернативи на REGEXP
В MySQL, RLIKE и REGXP операторите са синоними за REGEXP_LIKE() . Следователно можем да заменим всеки от предишните примери с NOT RLIKE или NOT REGEXP_LIKE() .
Пример за RLIKE :
SELECT c1 FROM t1
WHERE c1 NOT RLIKE '[[:alnum:]]';
Пример за REGEXP_LIKE() :
SELECT c1 FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:alnum:]]');