2011-06-21 23 views
53

¿Cuál es el tipo de campo correcto para la dirección IP en mysql? y ¿cuál es la forma correcta de almacenarlo utilizando PHP?Almacenamiento de direcciones IP en la base de datos MySQL usando PHP

+0

Depende de lo que quiera hacer con él y de la versión de IP que le interese. –

+0

depende de cómo se está a usarlo, pero en general, creo que será mejor varchar – Balanivash

+1

Esto podría ayudarle a: http://stackoverflow.com/questions/1038950/what-is-be-the-most-appropriate-data- type-for-storage-an-ip-address-in-sql-server? – Alfred

Respuesta

14

En general, usted puede ir con VARCHAR (45), ya que será el tiempo suficiente para incluso almacenar IPv6.

+7

IPv6 puede tener 45 caracteres si tiene una dirección de túnel. De acuerdo, es un caso extremo, pero ¿por qué no a prueba de futuro? – Robert

+0

Ah, sí, se olvidó de eso :) – Sander

+4

así que, básicamente, utiliza hasta 45 bytes para las direcciones que usan 16 bytes máx. me parece un desperdicio ... (con direcciones ipv4 empeora: dirección de 4 bytes y repr de cadenas de 15 bytes) – knittl

46

puede almacenarlos en un campo binario con una longitud de 128 bits (16 bytes, BINARY(16) o VARBINARY(16)). para convertir cualquier dirección IP a su representación binaria, puede usar la función php inet_pton. este método funcionará para direcciones IPv4 e IPv6. inet_ntop se puede utilizar para recuperar la representación de cadena de la dirección IP almacenada (independientemente de la versión)

+0

¿Puedo utilizar tanto para IPv6 e IPv4 – user552828

+2

@ user552828: sí, se puede usar tanto para IPv4 e IPv6 – knittl

+0

pero dicen que IPv6 puede contener hasta 45 caracteres en el caso de tunneled ip, ¿es la longitud de 128 bits está bien? Estoy preguntando porque no soy tan bueno en la codificación, soy un novato – user552828

59

This tutorial podría ayudarlo.

La forma más eficiente de ahorro de direcciones IPv4 es con un campo INT (no VARCHAR como era de esperar). Puede convertirlos usando PHP ip2long y volver usando la función INET_NTOA de MySQL o la función long2ip de PHP.

Si necesita almacenar IPv6, tendrá que utilizar un campo binario en lugar y la función de PHP inet_pton.

+0

no hay una función incorporada llamada 'ip2bin'. sin embargo, puede escribir uno usted mismo: 'function ip2bin ($ ip) {return inet_pton ($ ip); } ' – knittl

+0

@knittl - Agregué la función a la que me refería. Mi mal por no incluirlo. –

+4

@francois: ¿por qué no simplemente usar 'inet_pton'? ya funciona con casi todas las representaciones de cadenas de direcciones IP, sin necesidad de transformaciones complicadas – knittl

Cuestiones relacionadas