Guardar direcciones ip en MySql, IPV4 e IPV6

Para guardar direcciones ip en la base de datos MySql, lo más común o lo simple es guardarlo en un campo VARCHAR con una longitud 15, para ipv4, mientras que para direcciones ipv6 necesitariamos una longitud de alrededor de 43 carácteres.

Claro que existen mejores maneras de guardar estas direcciones, para ipv4, podemos utilizar la función INET_ATON(), la cual recibe como parametro una cadena que representa una dirección ipv4 y nos retorna

un valor numerico entero, el cual lo podemos almacenar en un campo INT UNSIGNED, y por el contrario para transformar nuestro numero en una dirección ip ocupamos la función INET_NTOA(), la cual nos retorna una cadena con la dirección ip.

SELECT INET_ATON('192.168.0.1');
# lo cual nos da como resultado 3232235521

SELECT INET_NTOA(3232235521);
# y a su vez tenemos el resultado '192.168.0.1'

Esto es más que suficiente para guardar direcciones ip, pero tenemos el inconveniente que solamente soporta ipv4, así que para ipv6 tenemos que cambiar un poquito las cosas, para lo cual podemos ocupar la función INET6_ATON(), y su inversa INET6_NTOA().

INET6_ATON()

Esta función toma como parametro una cadena que represente una dirección IPV4 o IPV6 y a su vez nos devuelve una representación binaria de la dirección, el cual lo podemos almacenar en un campo VARBINARY. Debido a que ipv6 es más grande que ipv4, la función nos devolvera un dato VARBINARY de tamaño 16, e ipv4 de tamaño 4, así que lo simplemente podemos guardarlo en un campo VARBINARY(16) para que podamos guardar tanto ipv4 e ipv6. En caso de que el argumento no sea valido la función devuelve NULL.

INET6_NTOA()

A su vez esta función toma un parametro de tipo VARBINARY y nos devuelve una cadena que representa una dirección ip, en caso de que el parametro no sea valido devuelve NULL.

EJEMPLO

Debido a que VARBINARY no es un formato que se pueda representar de manera visual, utilizamos la función HEX() para representarlos en formato hexadecinal, a su vez UNHEX() toma un formato hexadecinal y lo transforma un tipo binario.


SELECT HEX(INET6_ATON('2001:db8:85a3::8a2e:370:7334'));
# nos devuelve el valor 20010DB885A3000000008A2E03707334

SELECT INET6_NTOA(UNHEX('20010DB885A3000000008A2E03707334'));
# que a su vez nos devuelve '2001:db8:85a3::8a2e:370:7334'

# Y para direcciones ipv6
SELECT HEX(INET6_ATON('192.168.0.1'));
# nos devuelve C0A80001

SELECT INET6_NTOA(UNHEX('C0A80001'));
# y nos da el valor '192.168.0.1'

Pues bien esta seria una forma más eficiente para guardar nuestras direcciones ip en mysql, tambien funciona en mariadb.

 

1 comentario

  1. Anónimo dice:

    eficiente?
    me da a mi que tu lo de la eficiencia no lo comprendiste muy bien.

    – varbinary(16) es mucho mas rapido para hacer consultas sobre el.
    – ademas puedes buscar por rangos si usas varbinary
    – y ya si hablamos del ahorro de espacio, para un par de millones de IP puede ser muy considerable, claro que tu con 3 o 4 IPs que te visitaran por semana, tampoco es que ahorres mucho

    Me gusta

Deja un comentario