Cuando necesitamos guardar direcciones IP en nuestras bases de datos, lo más cómodo (y que casi hacemos por inercia) es asignar al campo un tipo VARCHAR con una longitud de 15 caracteres. Sin embargo, existe una opción mejor que poco a poco voy encontrándome en los principales CMS y Frameworks: INT UNSIGNED.
Así, utilizando el comando de MySQL INET_ATON, la dirección IP quedaría codificada en una cadena de 4 bytes que podríamos recuperar mediante su contrario INET_NTOA. Veamoslo con ejemplos:
1 2 3 4 5 6 7 | # Tomamos una direccion IP y la convertimos en una cadena de enteros: SELECT INET_ATON('192.168.0.10') AS ipn; # Esto se traduciría en 3232235530 # El proceso inverso: SELECT INET_NTOA(3232235530) AS ipa; # Nos devuelve nuestra direccion IP anterior: 192.168.0.10 |
Ésta sería la forma más eficiente para el almacenamiento de IPs en nuestra base de datos en lugar del recurrente VARCHAR(15).
¿Pero qué pasa si la ip está en su versión 6? (ipv6)
por lástima INT UNSIGNED sólo sirve para ipv4, esta semana me he estado dedicando a buscar la mejor manera de guardar la ip y tengo ese problema, ipv4 es lo más usado, pero el futuro está en ipv6.
Por cierto, hola! llegue a tu blog vía Google, se ve interesante, me pasaré más seguido 🙂
Efectivamente, las IPv6 están popularizándose poco a poco y MySQL no las soporta de forma nativa. Para la versión 6.0, se habló de implementar soporte para 128 bits que las manejase y en las especificaciones, aparecía un INET6_ para trabajar con ellas:
select inet6_ntop(inet6_pton('2001:4860:a005::68'));
Esto permitiría trabajar con rangos mediante construcciones del tipo ‘WHERE ip BETWEEN a AND b’. Sin embargo, dada la congelación de la versión 6.0 de MySQL, estas especificaciones han quedado ahí.
Más información aquí.
Tendremos que esperar para ver qué pasa con MySQL en general y cómo continuará el proyecto tras su adquisición por Oracle.
Un abrazo!