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

Hvordan matcher man en ip-adresse i mysql?

Du bliver nødt til at bruge REGEXP for at matche IP-adressens prikkede quad-mønster.

SELECT *
FROM yourtable
WHERE 
  thecolumn REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$'

Teknisk set vil dette matche værdier, der ikke er gyldige IP-adresser, såsom 999.999.999.999 , men det er måske ikke vigtigt. Hvad er vigtigt, er at rette dine data sådan, at IP-adresser gemmes i deres egen kolonne adskilt fra de andre data, du har herinde. Det er næsten altid en dårlig idé at blande datatyper i én kolonne.

mysql> SELECT '9876543210' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$';
+---------------------------------------------------------------------------+
| '9876543210' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$' |
+---------------------------------------------------------------------------+
|                                                                         0 |
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT '987.654.321.0' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$';
+------------------------------------------------------------------------------+
| '987.654.321.0' REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$' |
+------------------------------------------------------------------------------+
|                                                                            1 |
+------------------------------------------------------------------------------+

En anden metode er at forsøge at konvertere IP-adressen til et langt heltal via MySQL's INET_ATON() funktion . En ugyldig adresse vil returnere NULL .

Denne metode er sandsynligvis mere effektiv end det regulære udtryk.

Du kan indlejre den i en WHERE betingelse som:WHERE INET_ATON(thecolumn) IS NOT NULL

SELECT INET_ATON('127.0.0.1');
+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
|             2130706433 |
+------------------------+

SELECT INET_ATON('notes');
+--------------------+
| INET_ATON('notes') |
+--------------------+
|               NULL |
+--------------------+

SELECT INET_ATON('56.99.9999.44');
+----------------------------+
| INET_ATON('56.99.9999.44') |
+----------------------------+
|                       NULL |
+----------------------------+


  1. Hvad er forbindelsesstrengen for localdb til version 11

  2. Er der et ANSI SQL-alternativ til søgeordet MYSQL LIMIT?

  3. SQL rekursiv forespørgsel, der henter alle forfædre til et element

  4. Sådan udføres og administreres MySQL-sikkerhedskopier til Oracle DBA'er