Хранение IPv6 адресов в MySQL: альтернативы строкам и INT

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для надёжного хранения IPv6-адресов в MySQL рекомендуется выбрать тип данных BINARY(16). Преобразование адресов из текстового формата осуществляется с использованием функции INET6_ATON():

SQL
Скопировать код
CREATE TABLE ip_table (ip BINARY(16));
INSERT INTO ip_table (ip) VALUES (INET6_ATON('2001:db8::1'));

Чтобы отобразить адреса в удобочитаемом формате, используйте функцию INET6_NTOA():

SQL
Скопировать код
SELECT INET6_NTOA(ip) FROM ip_table;

Такой подход сочетает в себе компактность хранения и удобство представления данных.

Кинга Идем в IT: пошаговый план для смены профессии

Обработка смешанных типов

Для хранения адресов IPv4 и IPv6 подойдёт тип данных VARBINARY(16). Для предотвращения SQL-инъекций рекомендуется использовать функцию mysqli_real_escape_string:

SQL
Скопировать код
$escaped_ip = mysqli_real_escape_string($connection, $ip_address);
$query = "INSERT INTO ip_table (ip) VALUES (INET6_ATON('".$escaped_ip."'))";

Если вы используете версии MySQL до 5.6.3 и у вас нет функций INET6_ATON() и INET6_NTOA(), вы можете использовать пользовательские функции или функции вроде inet_pton и inet_ntop.

Расширение возможностей MySQL

Если у вас старые версии MySQL без поддержки IPv6, обновите сервер или используйте определённые пользователем функции (UDF) или внешние приложения.

Стратегия плавного перехода

Во время транзитного периода активно работайте с обоими версиями IP-адресов, чтобы снизить риски и избежать недоразумений.

Визуализация

Представление таблицы хранения для IPv4 и IPv6:

Markdown
Скопировать код
------------
|📄📄      | <- IPv4 (Компактнее)
|          |
|🗃️🗃️🗃️🗃️  | <- IPv6 (Объёмнее)
------------
mysql
Скопировать код
CREATE TABLE `ip_storage` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `ipv6_address` VARBINARY(16) NOT NULL,
  PRIMARY KEY (`id`)
);

Увеличенный размер данных для хранения IPv6 можно сравнить с большим чемоданом для ваших вещей.

Эффективные практики хранения

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

Подготовка к будущему

Учтите будущее расширение и переход на стандарт IPv6 при проектировании базы данных для IP-адресов.

Обновление с устаревших систем

Откажитесь от устаревших методов в пользу использования современных функций INET6 для работы с IPv6. Это сделает вашу систему более надёжной и эффективной.

Полезные материалы

  1. MySQL :: MySQL 5.7 Справочное руководство :: 12.20 Различные функции — Справочник по функциям IPv6 в MySQL.
  2. Как хранить совместимый с IPv6 адрес в реляционной базе данных – Stack Overflow — Советы сообщества по хранению IPv6 в реляционных БД.
  3. RFC 5952 – Рекомендации по текстовому представлению адресов IPv6 – Описание стандартов текстового представления IPv6-адресов.
  4. GitHub Gist: Оптимизация хранения IPv6-адресов — Рекомендации по оптимизации хранения IPv6.