2009-07-02 3 views
204

Можно создать дубликат:
Maximum length of the textual representation of an IPv6 address?Максимальная длина IP-адрес клиента

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

+0

Его уже покрыты здесь. Проверьте http://stackoverflow.com/questions/1038950/what-is-be-the-most-appro-data-type-for-storing-an-ip-address-in-sql-server – Arnkrishn

+4

Собственно, этот пост не очень полезно. Мы не используем Sql Server, и ответы на этот пост были краткими и точными, именно то, что я искал. –

+7

@ Andriyev, что сообщение относится только к IPv4. –

ответ

194

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

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

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

+4

Некоторые базы данных (по крайней мере, по умолчанию) имеют собственный тип столбца IP и делают преобразование для вас. – gnud

+4

Я бы не смешивал IPv4 и IPv6 в том же файле базы данных, что и «некоторое время». IPv4 по-прежнему является стандартом по умолчанию и будет использоваться в течение многих последующих лет. В старых приложениях, с которыми я работал, когда стало необходимо добавлять адреса IPv6 в базу данных, это было сделано как отдельная запись. Это позволило существующему коду ожидать, что адрес IPv4 останется на месте, а разрешенный код будет продолжать получать только IPv4-адрес. Для новых частей кода они имели возможность специально получать IPv4, IPV6 или сочетание из запроса. –

+0

Если вы собираетесь хранить IPv4 в виде одного байта, разве это не вопрос о том, какие структуры данных принимаются клиентом, который читает? Если бы вы сохранили его как единый INT, а клиент принял двоичный код, да, это было бы неплохо ... Я думаю, что вопрос о более крупном типе может быть интересным, в зависимости от количества и изощренность приложений. У вас могут быть приложения, которые принимают только один формат, или и то, и другое. Возможно, вы захотите иметь связанную область, в которой есть метка типа адресации. – benc

23

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

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

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

ВНИМАНИЕ: Если вы также хотите, чтобы адреса IPV4 отображались как адреса IPV6, use 45 characters as @Deepak suggests.

5

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

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

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

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

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

1

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

255.255.255.255 

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

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

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

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

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

10

Бери от кого-то, кто пытался это все три пути ... просто использовать VARCHAR (39)

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

2

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

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

323

Там в оговорка с общей 39-символьной структурой IPv6. Для IPv4-адресов с IPv4-адресами строка может быть длиннее (чем 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!)

+2

Мне кажется, что это неверно. Отображаемый IPv6-адрес не должен превышать 22 символа в соответствии с: https://tools.ietf.org/html/rfc5952#page-10 и https://tools.ietf.org/html/rfc4291#section-2.5.5 как они всегда имеют формат :: ffff: 000.000.000.000, и их необходимо укоротить – tarzan

+0

Интересно, действительно ли он имел в виду «ipv6-совместимый ipv4-адрес» в соответствии с https://tools.ietf.org/html/rfc4291#section- 2.5.5.1. Я никогда не помню, как они сидели в дикой природе. –

2

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

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

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

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

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

+0

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

Смежные вопросы