Максимальная длина ip-адреса клиента [дубликат]

Возможные Дубликаты:
максимальная длина текстового представления IPv6-адреса?

что бы вы рекомендовали в качестве максимального размера для столбца базы данных, хранящего IP-адреса клиентов? У меня он установлен в 16 прямо сейчас, но могу ли я получить ip-адрес, который длиннее, чем с IPv6 и т. д.?

8 ответов


для IPv4, вы может получите прочь с хранить 4 сырцовых байта IP-адреса (каждое из чисел между периодами в IP-адресе 0-255, т. е., один байт). Но тогда вам придется переводить вход и выход из БД, и это грязно.

IPv6-адреса составляют 128 бит (в отличие от 32 бит IPv4-адресов). Они обычно записываются как 8 групп из 4 шестнадцатеричных цифр, разделенных двоеточиями:2001:0db8:85a3:0000:0000:8a2e:0370:7334. 39 символов подходит для хранения IPv6-адресов в этом формате.

Edit: однако есть предостережение, см. ответ @Deepak для получения подробной информации о IPv4-сопоставленных IPv6-адресах. (Правильная максимальная длина строки IPv6 -45 символов.)


есть оговорка с общей структурой IPv6 символов 39. для IPv4 сопоставленных адресов IPv6, строка может быть длиннее (до 39 знаков). Пример, чтобы показать это:

IPv6 (39 символов):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD

IPv4-сопоставленный IPv6 (45 символов):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:192.168.158.190

Примечание: последние 32 бита (которые соответствуют адресу IPv4) могут нуждаться до 15 символов (поскольку IPv4 использует 4 группы по 1 байт и форматируется как 4 десятичных числа в диапазоне 0-255, разделенные точками (. символ), поэтому максимум DDD.DDD.DDD.DDD).

правильная максимальная длина строки IPv6, таким образом, составляет 45.

это был на самом деле вопрос викторины в тренинге IPv6, который я посетил. (Мы все ответили 39!)


Если вы хотите обрабатывать IPV6 в стандартной нотации, есть 8 групп из 4 шестнадцатеричных цифр:

2001:0dc5:72a3:0000:0000:802e:3370:73E4

32 шестнадцатеричные цифры + 7 разделителей = 39 символов.

внимание: если вы также хотите, чтобы IPv4-адреса отображались как IPV6-адреса,использовать 45 символы, как @Deepak предлагает.


возьмите его от кого-то, кто пробовал все три способа... просто используйте varchar (39)

немного менее эффективное хранилище намного перевешивает любое преимущество его преобразования при вставке / обновлении и форматировании при его отображении в любом месте.


как описано в IPv6 В Википедии статьи

IPv6-адреса обычно записываются восемь групп из четырех шестнадцатеричных цифры, где каждая группа разделена двоеточием (:)

типичный IPv6-адрес:

2001:0db8:85a3:0000:0000:8a2e:0370:7334

Это 39 символов. IPv6-адреса имеют длину 128 бит, поэтому вы можете использовать двоичный (16) столбец, но я думаю, что я буду придерживаться буквенно-цифрового представления.


IPv4 использует 32 бита, в виде:

255.255.255.255

Я полагаю, это зависит от вашего типа данных, просто ли вы храните как строку с типом CHAR или используете числовой тип.

IPv6 использует 128 бит. У вас не будет IPs дольше, чем это, если вы не включаете другую информацию с ними.

IPv6 сгруппирован в наборы из 4 шестнадцатеричных цифр, разделенных двоеточиями, например (из Википедии):

2001:0db8:85a3:0000:0000:8a2e:0370:7334

вы безопасно храните его как 39-символьная длинная строка, если вы хотите это сделать. Однако есть и другие способы стенографии для написания адресов. Наборы нулей могут быть усечены до одного 0, или наборы нулей могут быть полностью скрыты двойным двоеточием.


Если вы просто храните его для справки, вы можете сохранить его как строку, но если вы хотите сделать поиск, например, чтобы увидеть, находится ли IP-адрес в какой-либо таблице, вам нужно "каноническое представление."Преобразование всего этого в (большое) число-это правильная вещь. IPv4-адреса могут храниться как длинный int (32 бита), но для хранения IPv6-адреса требуется 128-битный номер.

например, все эти строки действительно один и тот же IP-адрес: 127.0.0.1, 127.000.000.001, ::1, 0:0:0:0:0:0:0:1


люди говорят о символах, когда можно сжать IP-адрес в необработанные данные.

Итак, в принципе, поскольку мы используем только IPv4 (32bit) или IPv6 (128bit), это означает, что вам нужно не более 128 бит пространства или 128/8 = 16 байт!

что намного меньше, чем предложенные 39 байтов (предполагая, что кодировка ascii).

тем не менее, вам придется декодировать и кодировать IP-адрес в / из необработанных данных, что само по себе является тривиальным do (я делал это раньше, см. PHP ip2long() для 32-разрядных IPs).

Edit: inet_pton (и его противоположность, inet_ntop()) делает то, что вам нужно, и работает с обоими типами адресов. Но будьте осторожны, в Windows он доступен с PHP 5.3.