MySQL 的 IP 处理函数
当前很多应用都适用字符串 char (15) 来存储 IP 地址(占用 16 个字节),利用 inet_aton () 和 inet_ntoa () 函数,来存储 IP 地址效率很高,适用 unsigned int 就可以满足需求,不需要使用 bigint,只需要 4 个字节,节省存储空间,同时效率也高很多。
inet_aton()
将 ip 地址转换成数字型。
给出一个作为字符串的网络地址的 "点地址"(如 127.0.0.1) 表示,返回一个代表该地址数值的整数。地址可以是 4 或 8 比特地址。
原理
网络地址:
192.168.33.123,
每一个值最大不会越过 255,也就是十六进制的 FF,两个 Byte 刚好表示的最大值是 255,
这样子,就可以用一个 32 位的整形来保存这个地址:
192 168 33 123
1100 0000 1010 1000 0010 0001 0111 1011
把这些二进制合在一起就是 32 位的数 11000000101010000010000101111011 了,
十进制为
3232244091。
即算法:第一位乘 256 三次方 + 第二位乘 256 二次方 + 第三位乘 256 + 第四位
>> select inet_aton('192.168.33.123')
3232244091
如果是错误的 IP 格式,则该函数会返回 null。
示例
>> select inet_aton('101.102.103.104')
1701209960
即:
101*256*256*256 + 102*256*256 + 103*256 + 104 = 1701209960
错误解析:
>> select inet_aton('101.102.103.284')
NULL
注意
在存储由 inet_aton () 产生的值时,推荐你使用 INT UNSIGNED 列。假如你使用 (带符号) INT 列,则相应的第一个八位组大于 127 的 IP 地址值会被截至 2147483647 (即 INET_ATON ('127.255.255.255') 所返回的值)。
inet_ntoa()
将数字型转换成 ip 地址。
给定一个数字网络地址 (4 或 8 比特),返回作为字符串的该地址的 ipV4 表示。
示例
>> select inet_ntoa(1701209960)
101.102.103.104
相关文章