Хранение IP-адресов в Microsoft SQL Server

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

Я хочу хранить 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-адреса в столбце uniqueidentifier. 128 бит, могут хранить оба формата адресов наиболее компактным способом (мы тратим 96 бит на адреса IPv4, но это неизбежно, что бы мы ни делали). Этот способ может показаться наиболее предпочтительным, но, учитывая любое 128-битное целое число, возможно ли узнать, представляет ли это 128-битное целое число IPv4 или IPv6-адрес?

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

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

6
задан Jake Petroules 16 July 2011 в 17:48
поделиться