Eu tenho que armazenar o endereço IP de todos os usuários registrados no banco de dados. Eu estou querendo saber, quantos caracteres devo declarar para tal coluna?
Devo suportar IPv6 também? Em caso afirmativo, qual é o comprimento máximo do endereço IP?
Não armazene como string. Use uma
int unsigned
coluna e armazene/recupere comINET_ATON()
eINET_NTOA()
respectivamente. AFAIK mysql não suporta INET_* para ipv6.EDIT conforme comentário
O uso da função integrada para converter IPs de/para inteiros (e, portanto, armazenar esses inteiros no banco de dados) tem o efeito colateral de validar automaticamente esses IPs. Digamos que você armazene um IP como VARCHAR(16), você deve certificar-se de não armazenar IPs inválidos (como 999.999.999.999 como exemplo) com alguma validação personalizada. As funções INET_* cuidam disso.
Sugiro a migração para PostgreSQL e uso de tipos de dados INET ou CIDR .
Provavelmente é hora de começar a considerar o IPv6. O MySQL não possui métodos para converter endereços IPv6 em formato binário. Uma string de quarenta caracteres lidará com qualquer endereço IPv6 normal. Existe um formato que pode exceder 40 caracteres, eu consideraria improvável que isso ocorresse na prática.
Você pode calcular o tamanho a partir da informação de que haverá no máximo 8 grupos de quatro caracteres com 7 caracteres separadores. O formato anormal substitui os dois últimos grupos por um endereço de formato IPv4. Sem compactação de endereço, ele substitui os últimos 9 caracteres por até 15 caracteres.
Se você estiver armazenando blocos, a indicação do tamanho do bloco pode ter 4 caracteres em vez dos 3 caracteres necessários para IPv4.
Você deve garantir que a formatação obtida seja consistente, mas todos os softwares que vi fornecem formatos consistentes para os endereços.
Aqui está a melhor resposta feita em uma das listas de discussão do MySQL. Leia o melhor tipo de campo para armazenar o endereço IP... .
Resumidamente, sugere, o que eu apoio, usar INT(10) UNSIGNED.
Então, usando 192.168.10.50:
(192 * 2^24) + (168 * 2^16) + (10 * 2^8) + 50 = 3232238130 (resulta em 192.168.10.50)
Ou
192 + (168 * 2^8) + (10 * 2^16) + (50 * 2^24) = 839559360 (Para trás, resulta em 50.10.168.192)
A partir do MySQL v5.6.3 eles adicionaram suporte para endereços IPv4 e IPv6
INET6_ATON
.INET6_NOTA
Mas eles não o armazenam mais como um número inteiro. IPv6 retorna umvarbinary(16)
e e IPv4 retorna umvarbinary(4)
.http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton
Você pode armazenar até 15 caracteres. Por favor, não use VARCHAR(15) porque são 16 bytes (o primeiro byte gerencia o comprimento da string e, portanto, recuperação e armazenamento mais lentos). Use CHAR(15) sempre em algo como um endereço IP.
Desculpe, não posso comentar as respostas. Há uma pergunta sobre isso no stackoverflow. E concordo totalmente com a resposta selecionada: usar 2xBIGINT é provavelmente a melhor maneira para o ipv6 atualmente.
Também é possível armazenar ipv4 neste bigints - marcando um deles NULL ou usando o formato V4COMPAT