Хранить IPv6 в базе данных


Как лучше всего хранить IP-адреса с помощью PHP в базе данных MySQL? Есть функция под названием ip2long - но это только для IPv4. Но как насчет IPv6?

Я знаю функцию php, которая предназначена для IPv6 IP, но она не работает в Windows с PHP <Версия 5.3

Author: Jon Seigel, 2010-01-12

6 answers

IPv4-адрес с десятичной запятой может быть преобразован в целое число с максимальным размером 32 бита. Адреса IPv6 имеют 128 бит. Поскольку 128 бит не помещаются в PHP int, с этим будет сложно работать в PHP.

Если вы просто хотите подключиться и использовать IPv6-адреса, избавьте себя от лишних хлопот и сохраните их в виде текста. Если вы хотите применить маски сетей и рассчитать подсети, вам необходимо их преобразовать.

 9
Author: Sjoerd, 2010-01-14 08:00:43

Knittl был ближе, вместо двоичного(16) используйте varbinary(16), как пользователь196009 ответил на соответствующий вопрос. Это работает на меня. Как?

Сохранение IP-адреса:

<?php
  $query = "insert into stats(vis_ip, id_stat) values('" . inet_pton('66.102.7.104') . "', '1')"; // google's IP address
  // using a PDO wrapper. http://www.phpclasses.org/package/5206-PHP-Execute-database-queries-from-parameters-using-PDO.html
  include_once 'db.php';
  $c = new DB();
  $visit = $c->getResults($query); // stored as binary
?>

Получение IP-адреса:

<?php
  $query = "SELECT `vis_ip` FROM `stats` WHERE `id_stat`=1";
  // PDO wrapper
  include_once 'db.php';
  $c = new DB();
  $stats = $c->getRow($query);
  echo inet_ntop($stats->vis_ip); // outputs 66.102.7.104
?> 

Он должен работать с адресами IPv6 (у меня есть соединение IPv4). Я не эксперт, поэтому пока не знаю, правильна ли длина переменной, но, как я сказал, это работает для меня.

Чтобы проверить, включена ли "Поддержка IPv6" в вашей версии PHP/хосте:

<?php
  phpinfo(INFO_GENERAL); // http://php.net/manual/es/function.phpinfo.php
?> 
 12
Author: quantme, 2017-05-23 12:32:43

Есть функция php inet_pton, он превратит строку ip-адреса в ее двоичное представление (как для ipv4, так и для ipv6). затем вы можете сохранить его как binary(16) в своей базе данных mysql.

Чтобы снова получить адрес, читаемый человеком, используйте inet_ntop

 9
Author: knittl, 2010-05-02 20:38:51

Обратите внимание, что MySQL (5.6) теперь поддерживает адреса IPv6, см. INET6_ATON().

 2
Author: Sebastien Horin, 2016-04-24 13:29:02

По второму комментарию на ip2long руководство по функциям у вас есть функция ip2long6 для IPv6 (и ниже приведены другие функции).

 0
Author: hsz, 2010-01-12 14:41:51

Вы могли бы просто сохранить его в виде строки в CHAR Я полагаю,

 0
Author: Thom Wiggers, 2010-01-12 16:53:48