knittl estaba más cerca, en lugar de binary(16) use varbinary(16) como usuario196009 respuesta en una pregunta relacionada. Esto funciona para mi. ¿Cómo?
Almacenando 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
?>
Recuperando 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
?>
Debería funcionar con direcciones IPv6 (tengo una conexión IPv4). No soy un experto, así que aún no sé si la longitud de varbinary es correcta, pero como dije, me funciona.
Para verificar si 'Soporte IPv6' está habilitado en su versión/host de PHP:
<?php
phpinfo(INFO_GENERAL); // http://php.net/manual/es/function.phpinfo.php
?>