sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo hacer coincidir una dirección IP en mysql?

Vas a necesitar usar REGEXP para que coincida con el patrón cuádruple de puntos de la dirección IP.

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

Técnicamente, esto coincidirá con valores que no son direcciones IP válidas, como 999.999.999.999 , pero eso puede no ser importante. Qué es importante, es arreglar sus datos de manera que las direcciones IP se almacenen en su propia columna separada de cualquier otro dato que tenga aquí. Casi siempre es una mala idea mezclar tipos de datos en una columna.

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

Otro método es intentar convertir la dirección IP en un número entero largo a través de INET_ATON() función . Una dirección inválida devolverá NULL .

Es probable que este método sea más eficaz que la expresión regular.

Puede incrustarlo en un WHERE condición como: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 |
+----------------------------+