mysql中经常需要ip地址字段,如何设计字段才能称得上是品学兼优的好设计?下面分析几种设计模式
方案1:varchar(15)-varchar(255)
大部分新手只要是字符串字段,不管什么类型,全部varchar(255)。有些考虑深一步用varchar(15),其实15跟255在这里没有区别,因为ip地址是15个字符,mysql实际保存时一定会先存15个字符,后面还会跟一个长度字符。所以就算设置为varchar(255),在存储时并不会比varchar(15)消耗多。
ps:实际消耗16字节
方案2:char(15)
这种方式相比上述有一点进步,实际消耗15字节
方案3:int(10) unsigned
此方案是实际使用中效率最高的,消耗4字节,保存和提取后需要计算才能使用。缩小保存的字节数不但节省空间,更利于搜索和范围查找。
转换规则:
下面是方案3用到的一些转换函数
php:
//php原生方法
//转换成无符号数,否则可能为负数
echo sprintf("%u",ip2long("192.168.0.1"));
echo long2ip(3232235521);
//php代码实现,ip中每个段乘以256的n次方,n为端数
$ip_arr = explode(".",$ip);
$ip_decimal = 0;
foreach($ip_arr as $i=>$s){
$ip_decimal += $s*pow(256,3-$i);
}
mysql:
select inet_aton("192.168.0.1");
select inet_ntoa(3232235521);