сохранение / получение адресов IPv4 и IPv6 в MySQL

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

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

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

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

Большое спасибо за любое руководство …

Solutions Collecting From Web of "сохранение / получение адресов IPv4 и IPv6 в MySQL"

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

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

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

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