Я знаю, что по этой теме уже много вопросов, но у меня может быть несколько дополнительных вопросов.
Я хочу хранить 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?