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