Доброй ночи. Нужна помощь. Произвольные IP адреса (IPv4, IPv6) преобразуются в двоичное представление с помощью inet_pton() на PHP и записываются в базу данных в поле BINARY(16). Поскольку версия базы данных в сферическом приближении не содержит функций INET_ATON() / INET_NTOA() для IPv6 (знаю что некоторые последние содержат, но далеко не везде они стоят) то MySQL запрос формируется костылем вида «x’».bin2hex($ip).«’» (ну либо UNHEX() - не принципиально).
Теперь о проблеме. Если адрес IPv4, то в базе первые 4 байта будут заполнены данными, остальные нулями. Итого если исходное значение переменной в бинарном виде (длина 4 байта) скормить функции inet_ntop - получается исходный IP адрес. Если этой же функции скормить 16-байтное значение с нулями, прочитанное из базы данных - оно преобразуется в IPv4 адрес вида aaaa:bbbb::
Использовать костыли вида
$back = inet_ntop(substr($bin,0,4));
(так - работает) с проверкой по сравнению хвоста строки с нуль-чарами не вариант. Как посоветуете решить данную проблему чтобы и IPv6 и IPv4 при чтении из базы подавались функции inet_ntop и на выходе всегда был корректный результат?