Вопрос по sql, database-design, database – Максимальная длина для IP-адреса клиента [дубликата]

242

Possible Duplicate:
Maximum length of the textual representation of an IPv6 address?

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

@ Андриев, этот пост относится только к IPv4. Android Eve
Это уже освещено здесь. Проверьтеstackoverflow.com/questions/1038950/… Arnkrishn
На самом деле, этот пост не очень полезен. Мы не используем Sql Server, и ответы на этот пост были лаконичны и, в сущности, именно то, что я искал. Tony Eichelberger
Для тех, кто придет сюда позже - если вам посчастливилось использовать Postgres, у них естьbuilt-in IP data typeтак что вот так. Wayne Werner

Ваш Ответ

8   ответов
8

IPv6 Википедия статья,

IPv6 addresses are normally written as eight groups of four hexadecimal digits, where each group is separated by a colon (:)

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

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

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

10

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

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

24

есть 8 групп по 4 шестнадцатеричных числа:

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

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

CAUTION: Если вы также хотите, чтобы адреса IPV4 отображались как адреса IPV6,использование45 characters as @Deepak suggests.

380

There's a caveat with the general 39 character IPv6 structure.  Для сопоставленных 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).

The correct maximum IPv6 string length, therefore, is 45.

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

Интересно, действительно ли он имел в виду «ipv6-совместимый адрес ipv4»? согласноtools.ietf.org/html/rfc4291#section-2.5.5.1, Я никогда не помню, чтобы видел их в дикой природе.
Мне кажется, что это не правильно. Максимальный размер отображаемого адреса IPv6 составляет 22 символа в соответствии с:tools.ietf.org/html/rfc5952#page-10 а такжеtools.ietf.org/html/rfc4291#section-2.5.5 поскольку они всегда имеют формат :: ffff: 000.000.000.000, и они должны быть сокращены
2

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

255.255.255.255

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

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

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

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

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

2

когда можно сжать IP-адрес в необработанные данные.

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

Что намного меньше, чем предложенные 39 байтов (при условии, что charset - это ascii).

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

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

@Elipticalview Я не думаю, что вы прочитали мой ответ вообще. Я никогда не упоминал 45 байтов нигде! Если вы преобразуете любое значение IPv4 (даже плохое, как вы упомянули) в необработанные данные, они никогда не должны превышать 4 байта - потому что, независимо от количества имеющихся у вас точек, они должны всегда составлять от 4 цифр до максимум 255.
239

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

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

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

По той же причине, по которой вы не храните IPv4 как 4 байта.
Некоторые базы данных (по крайней мере, postgres) имеют собственный тип столбца IP и выполняют преобразование для вас.
Зачем39 bytes когда IPv6 128 бит, т.е. занимает максимум16 bytes?
Я бы не стал смешивать IPv4 и IPv6 в одной и той же базе данных в течение некоторого времени. IPv4 по-прежнему является стандартом по умолчанию и будет использоваться в течение многих лет. В старых приложениях, с которыми я работал, когда возникла необходимость добавить адреса IPv6 в базу данных, это было сделано в виде отдельной записи. Это позволило существующему коду, который ожидал, что IPv4-адрес останется на месте, и позволить коду продолжать получать только IPv4-адрес. Для новых частей кода у них была возможность специально получить IPv4, IPV6 или смесь из запроса.
Если вы планируете запрашивать через битовую маску, то, очевидно, храните в байтах Если дополнительные 23 байта на строку являются проблемой для вас, то, очевидно, храните как байты. Не уверен, что проблема здесь.
2

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

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

Похожие вопросы