Максимальная длина для IP-адреса клиента

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

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

Ответ 1

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

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

Изменить: Однако есть оговорка, см. @Deepak answer для получения информации о IPv4-адресах IPv4. (Правильная максимальная длина строки IPv6 45 символов.)

Ответ 2

Предостережение с общей структурой IPv6 с 39 символами.. Для IPv4-адресов IPv6, сопоставленных 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!)

Ответ 3

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

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

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

ВНИМАНИЕ: Если вы также хотите, чтобы адреса IPV4 отображались как адреса IPV6, используйте символы 45, как предлагает @Deepak.

Ответ 4

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

Немножко менее эффективное хранилище намного превосходит любую выгоду от необходимости конвертировать его в insert/update и форматировать его, показывая его где угодно.

Ответ 5

Как описано в статье IPv6 Wikipedia,

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

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

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

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

Ответ 6

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

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

Ответ 7

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

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

Это намного меньше, чем предполагаемые 39 байт (предполагая, что charset is ascii).

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

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

Ответ 8

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

255.255.255.255

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

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

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

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

Вы надежно сохраняете его как длинную строку длиной 39 символов, если вы хотите это сделать. Существуют и другие сокращенные способы написания адресов. Множества нулей могут быть усечены до одного 0, или множества нулей могут быть полностью спрятаны двойной двоеточием.