Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment faire correspondre une adresse IP dans mysql?

Vous allez devoir utiliser REGEXP pour correspondre au quadrilatère pointillé de l'adresse IP.

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

Techniquement, cela correspondra à des valeurs qui ne sont pas des adresses IP valides, comme 999.999.999.999 , mais ce n'est peut-être pas important. Qu'est-ce qu'est important, est de fixer vos données de sorte que les adresses IP soient stockées dans leur propre colonne, séparées de toutes les autres données que vous avez ici. C'est presque toujours une mauvaise idée de mélanger les types de données dans une colonne.

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

Une autre méthode consiste à tenter de convertir l'adresse IP en un entier long via MySQL INET_ATON() fonction . Une adresse invalide renverra NULL .

Cette méthode est susceptible d'être plus efficace que l'expression régulière.

Vous pouvez l'intégrer dans un WHERE condition comme :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 |
+----------------------------+