mysql 使用inet_aton和inet_ntoa處理ip地址數(shù)據(jù)的實(shí)例
本文將介紹如何在數(shù)據(jù)庫(kù)中使用合適格式保存ip地址數(shù)據(jù),并能方便的對(duì)ip地址進(jìn)行比較的方法。
1、保存ip地址到數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)中保存ip地址,字段一般會(huì)定義為:
`ip` char(15) NOT NULL,
因?yàn)閕p地址(255.255.255.255)的最大長(zhǎng)度是15,使用15位char已足夠。
創(chuàng)建表user
CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, `ip` char(15) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
插入幾條數(shù)據(jù)
INSERT INTO `user` (`id`, `name`, `ip`) VALUES (2, 'Abby', '192.168.1.1'), (3, 'Daisy', '172.16.11.66'), (4, 'Christine', '220.117.131.12');
2、mysql inet_aton 與 inet_ntoa 方法
mysql提供了兩個(gè)方法來(lái)處理ip地址
inet_aton 把ip轉(zhuǎn)為無(wú)符號(hào)整型(4-8位)
inet_ntoa 把整型的ip轉(zhuǎn)為電地址
插入數(shù)據(jù)前,先用inet_aton把ip地址轉(zhuǎn)為整型,可以節(jié)省空間,因?yàn)閏har(15) 占16字節(jié)。
顯示數(shù)據(jù)時(shí),使用inet_ntoa把整型的ip地址轉(zhuǎn)為電地址顯示即可。
例子:
CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `ip` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
插入幾條數(shù)據(jù)
INSERT INTO `user` (`id`, `name`, `ip`) VALUES
(2, 'Abby', inet_aton('192.168.1.1')),
(3, 'Daisy', inet_aton('172.16.11.66')),
(4, 'Christine', inet_aton('220.117.131.12'));
mysql> select * from `user`;
+----+-----------+------------+
| id | name | ip |
+----+-----------+------------+
| 2 | Abby | 3232235777 |
| 3 | Daisy | 2886732610 |
| 4 | Christine | 3698688780 |
+----+-----------+------------+
查詢顯示為電地址
mysql> select id,name,inet_ntoa(ip) as ip from `user`; +----+-----------+----------------+ | id | name | ip | +----+-----------+----------------+ | 2 | Abby | 192.168.1.1 | | 3 | Daisy | 172.16.11.66 | | 4 | Christine | 220.117.131.12 | +----+-----------+----------------+
3、比較方法
如果需要找出在某個(gè)網(wǎng)段的用戶(例如:172.16.11.1 ~ 172.16.11.100),可以利用php的ip2long方法,把ip地址轉(zhuǎn)為整型,再進(jìn)行比較。
<?php
$ip_start = '172.16.11.1';
$ip_end = '172.16.11.100';
echo 'ip2long(ip_start):'.sprintf('%u',ip2long($ip_start)); // 2886732545
echo 'ip2long(ip_end):'.sprintf('%u',ip2long($ip_end)); // 2886732644
?>
查詢:
mysql> select ip,name,inet_ntoa(ip) as ip from `user` where ip>=2886732545 and ip<=2886732644; +------------+-------+---------------+ | ip | name | ip | +------------+-------+---------------+ | 2886732610 | Daisy | 172.16.11.66 | +------------+-------+---------------+
注意:使用ip2long方法把ip地址轉(zhuǎn)為整型時(shí),對(duì)于大的ip會(huì)出現(xiàn)負(fù)數(shù),出現(xiàn)原因及處理方法可以參考我另一篇文章:《詳談php ip2long 出現(xiàn)負(fù)數(shù)的原因及解決方法》
4、總結(jié)
1、保存ip地址到數(shù)據(jù)庫(kù),使用unsigned int格式,插入時(shí)使用inet_aton方法把ip先轉(zhuǎn)為無(wú)符號(hào)整型,可以節(jié)省存儲(chǔ)空間。
2、顯示時(shí)使用inet_ntoa把整型ip地址轉(zhuǎn)為電地址。
3、php ip2long轉(zhuǎn)ip為整型時(shí),需要注意出現(xiàn)負(fù)數(shù)。
以上這篇mysql 使用inet_aton和inet_ntoa處理ip地址數(shù)據(jù)的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持本站。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信