为什么会问如何存储IP?首先澄清一些人要问的问题:为什么会问如何存储IP?不就是varchar类型吗?事实上,任何程序设计都必须在功能实现的基础上最大限度地优化性能。而数据库设计是程序设计中不可忽视的重要组成部分,巧妙地存储IP地址可以在一定程度上得到很大的提高。使用函数算法处理MySQL不直接提供IP类型字段,但是如果有两个函数可以转换IP和***长度为10位,那么使用int类型存储IP的性能要比varchar类型好存储IP地址提高很多,减少很多空间。因为varchar是变长形式,所以需要多一个字节来存储长度。另外,int类型在逻辑运算上比varchar快。IP转数字函数inet_aton()我们转换几个常用的IP地址----------+|inet_aton('255.255.255.255')|+-----------------------------+|4294967295|+----------------------------+1rowinset(0.00sec)mysql>selectinet_aton('192.168.1.1');+------------------------+|inet_aton('192.168.1.1')|+------------------------+|3232235777|+---------------------------+1rowinset(0.00sec)mysql>selectinet_aton('10.10.10.10');+------------------------+|inet_aton('10.10.10.10')|+------------------------+|168430090|+---------------------------+1rowinset(0.00sec),所以IP表字段可以设置为INT(10)。如果获取不到IP,可以直接存0表示获取不到。IP表示数字转IP函数inet_ntoa()mysql>selectinet_ntoa(4294967295);+--------------------+|inet_ntoa(4294967295)|+-----------------------+|255.255.255.255|+----------------------+1rowinset(0.00sec)mysql>selectinet_ntoa(3232235777);+--------------------+|inet_ntoa(3232235777)|+-----------------------+|192.168.1.1|+----------------+1rowinset(0.00sec)mysql>selectinet_ntoa(168430090);+--------------------+|inet_ntoa(168430090)|+--------------------+|10.10.10.10|+--------------------+1rowinset(0.00sec)mysql>selectinet_ntoa(0);+-------------+|inet_ntoa(0)|+------------+|0.0.0.0|+------------+1rowinset(0.00sec)整数比较fields比strings效率高很多,这也符合一个优化原则:字段类型定义使用最合适(最少)最简单的数据类型inet_aton()算法,实际上是借用了各国的国际IP地址的ip区分中使用的数字。a.b.c.d的ip数为:a*256的3次方+b*256的2次方+c*256的1次方+d*256的0次方。以上就是MySQL存储IP地址的方法,希望对大家的学习有所帮助。
