Tipos de datos para almacenar una dirección IPv4

Cuando tenemos que almacenar una dirección IP en un campo de la base de datos, tenemos que elegir el tipo de dato a utilizar. Para esta publicación consideramos una dirección IPv4, la cual está formada por 4 octetos. Analizaremos 4 posibles implementaciones:

La primer aproximación sería utilizar un CHAR(15) dado que la mayor dirección IPv4 es ‘255.255.255.255’. Este enfoque consume 15 bytes ya se que guardemos una dirección como la indicada o ‘1.1.1.1’.

Entonces podríamos pensar en utilizar un VARCHAR(15) que en el peor de los casos consume 16 bytes (15 de datos + 1 del prefijo longitud), pero al almacenar ‘1.1.1.1’ consumiría solo 8 bytes.

Pasando al tipo numérico, planteamos utilizar 4 campos de tipo TINYINT UNSIGNED (cada uno consume 1 byte), donde cada uno puede almacenar un valor entre 0 y 255. Por lo que en conjunto consumiríamos nada más que 4 bytes! Si bien parece óptimo, lo molesto es obtener el valor de los 4 campos y concatenarlos con un punto (.) cada vez que necesitemos mostrar la dirección IP. Análogamente deberemos separar la dirección mediante los puntos y almacenar cada valor en un campo diferente.

Finalmente, existe una alternativa que es mucho mejor es usar la función de Mysql INET_ATON(dir-ip-octetos), la cual a partir de un string que representa una dirección IPv4, retorna un entero que es igual al valor numérico de la misma. De esta manera podemos almacenar el resultado en un campo de tipo INT UNSIGNED, que consume 4 bytes pero a diferencia de la propuesta anterior lo hace en un único campo, facilitando el tratamiento del insert y update.

Atención: NO utilicen un campo tipo INT porque como su límite superior es 2147483647, no podrá almacenar direcciones transformadas cuyo prmier octeto sea mayor a 127.

Ejemplo de funcionamiento de INET_ATON:

mysql> SELECT INET_ATON('192.168.0.1');

-> 3232235521

Para recuperar el valor almacenado, usamos la función inversa INET_NTOA(dir-ip-decimal) que convierte el valor decimal nuevamente al string de 4 octetos.

Ejemplo de funcionamiento de INET_ATON:

mysql> SELECT INET_NTOA('3232235521');

-> 192.168.0.1

Para verificar que un string represente una dirección IPv4 válida, podemos utilizar IS_IPV4(dir-ip-octetos). Si retorna 1, entonces podemos estar seguros que INET_ATON(dir-ip-octetos) será distinto de NULL.

Cálculo del valor numérico de una dirección IPv4

Teniendo una dirección con la forma:

v1.v2.v3.v4

su valor numérico se calcula así.

v1 * 256^3 + v2 * 256^2 + v3 * 256^1 + v4 * 256^0

que es lo mismo que:

v1 * 256^3 + v2 * 256^2 + v3 * 256 + v4

 

Ejemplo:

192.168.0.1 = 192 * 256^3 + 168 * 256^2 + 0 * 256 + 1 = 3232235521

Tagged with: , ,
Publicado en Aplicaciones