MySQL中INET_ATON()、INET_NTOA函数

本文介绍了一种高效存储和查询IPv4地址的方法。通过使用MySQL的INET_ATON()和INET_NTOA()函数,可以将IPv4地址作为无符号整数存储,这不仅节省了存储空间,还提高了查询效率。文章提供了具体的SQL语句示例,展示了如何实现这一过程。

对于 IPv4 地址。人们经常使用VARCHAR(15)列去存储IP地址。然而,它们实际上是32位无符号整数,不是字符串。用小数点将地址分成4段的表示方法只是为了让人们阅读容易。所以应该用无符号整数存储IP地址。MySQL 提供了 INET_ATON()INET_NTOA() 函数在这两种表示方法之间转换。MySQL 5.6 版本之后,也有了解释  IPv6 地址的方法,就是INET6_ATON() INET6_NTOA() 函数

INET_ATON(IP) 函数——把ip转为无符号整型(4-8位)

假如需要在表中查出IP 在 192.168.1.13 到 192.168.1.23之间的 IP 地址

SELECT * FROM ip_table WHERE INET_ATON(ip) > INET_ATON('192.168.1.13') AND INET_ATON(ip) < INET_ATON('192.168.1.23'); 

 

 

 INET_NTOA函数——把整型的ip转为字符串式的地址

插入数据前,先用inet_aton把ip地址转为整型,显示数据时,使用inet_ntoa把整型的ip地址转为字符串格式的地址显示即可。

INSERT INTO `ip_table`(`id`,`ip`) VALUES 
(1,inet_aton('192.168.1.1')),
(2,inet_aton('192.168.1.2')),
(3,inet_aton('192.168.1.3')),
(4,inet_aton('192.168.1.4')),
(5,inet_aton('192.168.1.5'));

 现在插入到数据库的数据如下:

接着转换成我们熟悉的 IP 地址

SELECT id,INET_NTOA(ip) AS ip FROM ip_table ;

 

 

 

 

 

 

`inet_aton` 和 `inet_ntoa` 是用于在 IP 地址的点分十进制字符串表示形式和 32 位二进制整数之间进行转换的标准函数,常用于网络编程中处理 IPv4 地址。这两个函数属于 POSIX 标准库中的 `<arpa/inet.h>` 头文件(在 Linux/Unix 系统中)。 ### `inet_aton` 该函数将 IPv4 地址从字符串表示形式(如 `"192.168.1.1"`)转换为网络字节序的 32 位二进制整数(即 `in_addr_t` 类型)。其原型如下: ```c int inet_aton(const char *cp, struct in_addr *inp); ``` - `cp`:指向一个以点分十进制格式表示的 IPv4 地址字符串。 - `inp`:指向一个 `struct in_addr` 结构体的指针,用于存储转换后的二进制地址。 返回值: - 成功时返回 1; - 输入无效则返回 0。 示例代码: ```c #include <stdio.h> #include <arpa/inet.h> int main() { struct in_addr ip; int success = inet_aton("192.168.1.1", &ip); if (success) { printf("Binary representation: %u\n", ip.s_addr); } else { printf("Invalid address.\n"); } return 0; } ``` ### `inet_ntoa` 该函数的作用与 `inet_aton` 相反,它将网络字节序的 32 位 IPv4 地址转换为点分十进制字符串形式。其原型如下: ```c char *inet_ntoa(struct in_addr in); ``` - `in`:包含网络字节序的 IPv4 地址的 `struct in_addr` 结构体。 返回值是一个静态分配的字符串,表示转换后的 IP 地址[^1]。 示例代码: ```c #include <stdio.h> #include <arpa/inet.h> int main() { struct in_addr ip; inet_aton("192.168.1.1", &ip); char *ip_str = inet_ntoa(ip); printf("IP Address: %s\n", ip_str); return 0; } ``` ### 注意事项 - `inet_ntoa` 返回的是一个静态缓冲区的指针,因此在多线程环境中或多次调用时需要注意数据覆盖问题。 - 这两个函数仅支持 IPv4 地址。对于 IPv6 地址,应使用 `inet_pton` 和 `inet_ntop` 函数来替代。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值