Хранение IP-адресов в Microsoft SQL Server - PullRequest
6 голосов
/ 14 июля 2011

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

Я хочу хранить IP-адреса в базе данных (один столбец, если это возможно). Я хочу иметь возможность хранить адреса IPv4 или IPv6. Я хочу иметь возможность различать адреса IPv4 и IPv6 при получении.

Подходы, которые я рассмотрел:

  • Используйте VARCHAR (45) для сохранения IP-адресов в текстовом формате. Максимальная длина текстового представления адреса IPv4 составляет 15 символов. Максимальная длина текстового представления адреса IPv6 составляет 39 символов, хотя я читал, что на самом деле они могут быть до 45 при прокси-адресе IPv4 (не то, что я Я знаком с этим, поэтому я могу быть здесь) - файлы заголовка в некоторых программах, кажется, отражают это, указывая 46 в качестве максимальной длины адреса IPv6 (45 + \ 0). Различие между форматами тривиально.

  • Хранить IP-адреса в двух столбцах bigint. Это занимает меньше места, чем текстовый формат. Различие между форматами - если первый столбец равен 0 или NULL (хотя это плохо сказывается на производительности), это адрес IPv4, в противном случае IPv6?

  • Хранить IP-адреса в столбце уникального идентификатора. 128 бит, могут хранить оба формата адресов наиболее компактным способом (мы тратим 96 бит на адреса IPv4, но это неизбежно независимо от того, что мы делаем). Этот способ может показаться наиболее предпочтительным, но при наличии любого 128-битного целого числа возможно ли узнать, представляет ли это 128-битное целое число адрес IPv4 или IPv6?

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

Также ... если бы это было необходимо, было бы хорошей идеей добавить битовый столбец в сочетании с третьим подходом (для различия между IPv4 и IPv6)? Является ли битовый столбец физически 1-битным или 8?

1 Ответ

3 голосов
/ 14 июля 2011

Я могу хранить его в двоичном виде Адрес IPv6 имеет длину 128 бит -> 16 байтов. Если вы храните адрес IPv4, вы должны хранить его в последних 4 байтах. Когда вы используете это поле в приложении, есть много встроенных опций для преобразования из IPv6 в текст и обратно в двоичный файл IPv6.

В случае IPv4: первые 80 бит (10 байтов) этого типа адреса установлены в ноль, а следующие 16 битов (2 байта) установлены в единицу (0xFF), а его последние 32 бита (4 байта) заполнены адрес IPv4. Реализация стека обычно отличается, поэтому вы должны выполнить преобразования на стороне клиента (от IPv6 до IPv4). Это адресное пространство является безопасным, поэтому оно зарезервировано для адресации IPv4.

Подробнее и Подробнее .

...