Mysql
 sql >> Database >  >> RDS >> Mysql

2 modi per restituire righe che contengono caratteri alfanumerici in MySQL

Di seguito sono riportate due opzioni per trovare quelle righe che contengono caratteri alfanumerici in MySQL.

I caratteri alfanumerici sono caratteri alfabetici e caratteri numerici.

Dati di esempio

Utilizzeremo i seguenti dati per i nostri esempi:

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;

Risultato:

+----------------------+
| 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                |
+----------------------+

Opzione 1:confronta con [:alnum:]

Possiamo usare REGEXP di MySQL per confrontare la nostra colonna con un'espressione regolare.

La capacità di espressione regolare di MySQL include il supporto per le classi di caratteri POSIX. Pertanto, possiamo usare il [:alnum:] classe di caratteri POSIX nelle nostre espressioni regolari per trovare le righe che contengono caratteri alfanumerici.

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[[:alnum:]]+$';

Risultato:

+-------+
| c1    |
+-------+
| Music |
| Café  |
| 007   |
| é     |
| É     |
| ø     |
+-------+

Ciò ha restituito solo quelle righe che non contengono altro che caratteri alfanumerici. Se una riga contiene sia caratteri alfanumerici che non alfanumerici, non viene restituita.

Il carattere spazio è considerato non alfanumerico, quindi se vogliamo includere spazi, possiamo farlo:

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[[:alnum:] ]+$';

Risultato:

+---------------+
| c1            |
+---------------+
| Music         |
| Live Music    |
| Café          |
| Café Del Mar  |
| 100 Cafés     |
| Player 456    |
| 007           |
| é             |
| É             |
| é 123         |
| ø             |
| ø 123         |
+---------------+

Per restituire tutte le righe che contengono caratteri alfanumerici (anche se la riga contiene anche caratteri non alfanumerici), possiamo farlo:

SELECT c1 FROM t1 
WHERE c1 REGEXP '[[:alnum:]]';

Risultato:

+-------------------+
| c1                |
+-------------------+
| Music             |
| Live Music        |
| Café              |
| Café Del Mar      |
| 100 Cafés         |
| [email protected] |
| 1 + 1             |
| $1.50             |
| Player 456        |
| 007               |
| é                 |
| É                 |
| é 123             |
| ø                 |
| ø 123             |
+-------------------+

Opzione 2:specifica un intervallo di caratteri

Un altro modo per farlo è fornire un'espressione regolare che fornisca un intervallo di caratteri. Possiamo ancora usare il REGEXP operatore per farlo.

Esempio:

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[A-Za-z0-9]+$';

Risultato:

+-------+
| c1    |
+-------+
| Music |
| 007   |
+-------+

Ciò ha restituito meno righe rispetto al nostro primo esempio. Questo perché non ho incluso il é , É o ø caratteri nel mio intervallo, quindi tutte le righe che contengono quei caratteri sono escluse dall'output.

Pertanto, dovrai fare attenzione quando utilizzi questo metodo, nel caso in cui escludi accidentalmente i caratteri che dovresti includere.

Tuttavia, mantenendo questa gamma, possiamo includere spazi come questo:

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[A-Za-z0-9 ]+$';

Risultato:

+------------+
| c1         |
+------------+
| Music      |
| Live Music |
| Player 456 |
| 007        |
+------------+

E possiamo usare quanto segue per includere tutte le righe che contengono caratteri del nostro intervallo (anche se contengono anche caratteri al di fuori di questo intervallo):

SELECT c1 FROM t1 
WHERE c1 REGEXP '[A-Za-z0-9]';

Risultato:

+-------------------+
| c1                |
+-------------------+
| Music             |
| Live Music        |
| Café              |
| Café Del Mar      |
| 100 Cafés         |
| [email protected] |
| 1 + 1             |
| $1.50             |
| Player 456        |
| 007               |
| é 123             |
| ø 123             |
+-------------------+

Alternative a REGEXP

In MySQL, il RLIKE e REGXP gli operatori sono sinonimi di REGEXP_LIKE() . Pertanto, possiamo sostituire uno qualsiasi degli esempi precedenti con RLIKE o REGEXP_LIKE() .

Esempio di RLIKE :

SELECT c1 FROM t1 
WHERE c1 RLIKE '^[[:alnum:]]+$';

Esempio di REGEXP_LIKE() :

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');