Autor Zpráva
jan99
Profil *
Ahoj, muze mi nekdo vysvetlit jake vyhody plynou z prevodu ipv4 pres funkci ip2long()??

Pokud ukladam ip do databaze a vybírám prikazem "SELECT .. WHERE ip" tak integer ktery vznikne pres funkci ip2long() bude nalezen rychleji, nez napr. ip ulozeno jako typ varchar "127.0.0.1" ??

Do ted sem ukladal ipv4 do datababaze jako cislo ktere vzniklo pres ip2long() ale potrebuju sloupec predelat aby se do neho dala ulozit i ipv6 jenze pro ipv6 se neda pouzit funkce ip2long().

Jedine nejjednodussi reseni co me napada je ukladat ty ip tak jak sou do sloupce typu VARCHAR.
Casero
Profil
jan99:
Výhody jsou v menší potřebné kapacitě na uložení a i snadnější porovnávání. Ale podle mě jsou to zanedbatelné rozdíly. Jinak v manuálu k ip2long najdeš funkci pro ipv4 i ipv6.
This function converts ipv4 and ipv6, returns false if ip is not valid 

<?php 
function ip2bin($ip) 
{ 
    if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) 
        return base_convert(ip2long($ip),10,2); 
    if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) 
        return false; 
    if(($ip_n = inet_pton($ip)) === false) return false; 
    $bits = 15; // 16 x 8 bit = 128bit (ipv6) 
    while ($bits >= 0) 
    { 
        $bin = sprintf("%08b",(ord($ip_n[$bits]))); 
        $ipbin = $bin.$ipbin; 
        $bits--; 
    } 
    return $ipbin; 
} 

function bin2ip($bin) 
{ 
   if(strlen($bin) <= 32) // 32bits (ipv4) 
       return long2ip(base_convert($bin,2,10)); 
   if(strlen($bin) != 128) 
       return false; 
   $pad = 128 - strlen($bin); 
   for ($i = 1; $i <= $pad; $i++) 
   { 
       $bin = "0".$bin; 
   } 
   $bits = 0; 
   while ($bits <= 7) 
   { 
       $bin_part = substr($bin,($bits*16),16); 
       $ipv6 .= dechex(bindec($bin_part)).":"; 
       $bits++; 
   } 
   return inet_ntop(inet_pton(substr($ipv6,0,-1))); 
} 
?>
Majkl578
Profil
jan99:
IPv6 ukládej jako string, jako číslo to stejně neuložíš. BIGINT v MySQL má velikost 8 bajtů (64 bitů), kdežto IPv6 má 128 bitů.
Jurkovič
Profil *
Co tedy v mySQL vybrat, aby se hodnota uložila správně? Akorát si tohle dělám a chci to v mySQL navolit dobře.
Stačí navolit BIGINT (128) ?
Majkl578
Profil
8 čtyřčíselných bloků, 7 dvojteček, tj. VARCHAR(39).
Ještě odkážu téma na Stack Overflow, kde se to řešilo.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: