我目前在我的图片网站上有一个喜欢的功能,它将数据库中的用户IP存储在唯一的$ imgids中。
IP目前存储为字符串。为了节省空间,我想将IP不是作为带小数点的字符串存储,而是存储为32位整数(每个整数1位,而字符串中每个字符1个字节)。我认为这可以节省相当大的空间,因为我有可能有n个独特的IP来喜欢x图像...
所以给定字符串“109.181.156.221”,数字最多为12个字节,每个小数点数为+ 3个字节...所以15个字节* 5000个IP * 10个图像ID = 7.1 Mb
Versus 32bit 109181156221,4个字节* 5000个IP * 100个图像ID = 2 Mb
所以,在我使用IP之前,我想使用正则表达式删除小数,然后将IP存储为数字......“109.181.156.221” - > 109181156221 我是Regexs的新手,但我已经尝试过了,但它不会起作用:
$ipINT = preg_replaceAll("\\.+$", "" , $ipString);
所以我的问题是:
1)在Mysql数据库中空间节省是否重要?这是 值得的麻烦?
2)我的正则表达式在哪里?
3)如果我正在尝试阅读它,我能将其转换回来吗?
有什么想法吗?
谢谢!
答案 0 :(得分:4)
您可以使用ip2long(),然后它应该适合无符号的int列。
答案 1 :(得分:3)
有不同的方法可以做到这一点:
让数据库为您进行转换。您必须将IP存储在数据库中INT(10) UNSIGNED
并使用INET_ATON& INET_NTOA:
SELECT INET_ATON("109.181.156.221"); // result 1840618717
SELECT INET_NTOA("1840618717"); // result 109.181.156.221
使用PHP内部函数ip2long()& long2ip()然后将其存储在DB中:
$ipINT = ip2long('109.181.156.221'); // result 1840618717
$ip = long2ip('1840618717'); // result 109.181.156.221
删除点并添加“0”,如果需要可以将其转换回来:
function ip2int($ip){
$chunks = explode(".", $ip);
$int = '';
foreach($chunks as $chunk){
$int .= str_pad($chunk, 3, '0', STR_PAD_LEFT);
}
return $int;
}
function int2ip($int){
$chunks = str_split($int, 3);
$c = count($chunks);
$ip = ltrim($chunks[0], '0');
for($i=1;$i<$c;$i++){
$ip .= '.' . ltrim($chunks[$i], '0');
}
return($ip);
}
echo ip2int("109.1.156.5") . '<br>'; // result 109001156005
echo int2ip("109001156005"); // result 109.1.156.5
$ip = "109.181.156.221";
$replace = preg_replace("/\./", "", $ip); // This will remove all the dots
echo $replace; // result 109181156221
答案 2 :(得分:2)
使用ip2long()
功能存储IP地址 - 无符号INT(10)应该很棒。
使用long2ip()
进行解码。
http://php.net/manual/en/function.ip2long.php
您的解决方案不适用于1.123.123.123之类的IP地址,因为您不知道在哪里恢复小数点。存储IP地址的正确方法是使用上述方法。
答案 3 :(得分:0)
如果你只想提取你不需要正则表达式的数字,你可以使用:
filter_var('109.181.156.221', FILTER_SANITIZE_NUMBER_INT);
会给你 109181156221
但我认为你无法将其转换回IP格式。
我会用点存储它。