在数据库中存储IP地址,应该怎么存储?
如果使用字符串方式存储的话,查询效率和存储空间使用都不理想。
使用无符号整型(unsigned int(10))来存储会更好,并且MySQL服务器提供了IP地址和整型转换的函数。
一、IP地址转为整型数字
将IP地址转换计算为整型数字的函数为inet_aton()函数。
mysql> select inet_aton('255.255.255.255');
+------------------------------+
| inet_aton('255.255.255.255') |
+------------------------------+
| 4294967295 |
+------------------------------+
1 row in set (0.00 sec)
所以IP的表字段设置为INT(10)即可,如果IP获取不到可以直接存0代表获取不到IP的意思
二、整型数字还原为IP地址
将整型数字还原为IP地址的函数为inet_ntoa()函数。
mysql> select inet_ntoa(4294967295);
+-----------------------+
| inet_ntoa(4294967295) |
+-----------------------+
| 255.255.255.255 |
+-----------------------+
1 row in set (0.00 sec)
注意,0转换为 0.0.0.0
三、创建数据表示例
示例:创建一个用于存储用户登录系统的数据表。表结构包括用户ID,登录的IP地址和登录的时间。
create table login_log(
userid int unsigned,
login_ip int unsigned,
login_time timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);