хранение / получение адресов IPv4 и IPv6 в MySQL - PullRequest
1 голос
/ 02 октября 2011

Извините, я не знаю много об этом предмете, но все, что я ищу, это быстрое и простое решение для уникального представления любого IP-адреса (v4 / v6) в MySQL, чтобы я мог легко получить последний раз(если есть), что конкретный компьютер посетил мой сайт.

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

Я видел много решений для хранения IP-адресов, но неясно, какие из них работают для обоихверсии.Встроенный в MySQL INET_ATON, похоже, не поддерживает IPv6.Inet_pton в PHP выглядит многообещающе, но требует предварительного знания формата адреса.Я также не уверен в его использовании (тип поля MySQL и запись оператора вставки через PHP).Я видел varchar (39), используемый для представления адресов IPv6 в виде строк, и мне нравится, что это решение несколько не зависит от конфигурации сервера;Тем не менее, я немного беспокоюсь о дисковом пространстве.Будет ли этого подхода достаточно для всех адресов, которые может выводить $ _SERVER ['HTTP_CLIENT_IP']?

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

Большое спасибо за любые рекомендации ...

Ответы [ 2 ]

2 голосов
/ 02 октября 2011

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

Стоимость этого заключается в том, что вам нужно выполнить преобразование из адреса -> числа, прежде чем вставить значение в базу данных.Это (немного) увеличит нагрузку на ваш веб-сервер, поэтому вам нужно выяснить, где будет ваше узкое место, и оптимизировать для этого.

Дополнительным преимуществом сохранения адресов в виде чисел является то, что вы можетеиметь очень эффективный индекс для столбцов, поэтому поиск адреса будет молниеносным.Индексирование varchar столбцов очень дорого.

2 голосов
/ 02 октября 2011

Я бы пошел с этим: citat оттуда: Как сохранить IPv6-совместимый адрес в реляционной базе данных"Окончательное решение принято: 2xBIGINT, если второй bigint равен NULL, то это означает IPv4"

...