å¨ MySQL ä¸ï¼IP å°åæ¯ä¸ä¸ªé常éè¦çæ°æ®ç±»åï¼æ们ç»å¸¸éè¦å¨æ°æ®åºä¸åå¨åæ¥è¯¢å¤§éç IP å°åæ°æ®ã
åæ¶ï¼åå¨ IP å°åæ°æ®åæ¯ä¸ä¸ªæ¯è¾å¤æçé®é¢ï¼å¦æééäºåå¨æ¹å¼ï¼æ¥è¯¢é度就ä¼å¾æ ¢ã
æå»å¹´æ¾ç»åè¿ä¸æ¬¡ä¼åï¼ä» ä» åªæ¯æ¹åäºæ°æ®ç±»åï¼æçå°±æé«äºè³å° 100 åï¼åæ¬è¦ 4ã5 天å®æç计ç®ä»»å¡ï¼ç»æ两å°æ¶ä¸å°å°±å ¨é¨æå®äº......
æ¬ç¯éç¹ä»ç» MySQL çå ç§å¸¸è§ IP å°ååå¨æ¹å¼ç使ç¨åä¼åï¼è¯¦è§£ IP å°å转æ¢ä¸ºæ´æ°åå¨çæ¹æ³çï¼ä¸º IP å°ååå¨æ¹å¼çæ£ç¡®éåæä¾åèã
01
IPå°å
å æ¥åé¡¾ä¸ IP å°åçä¸äºåºç¡ç¥è¯ã
IP å°åæ¯ç± 32 ä½æ 128 ä½äºè¿å¶æ°åç»æçï¼ä¸»è¦ç¨æ¥æ è¯è®¾å¤çå°åã
æ¯ä¸ªIP å°åé½ç±ç½ç»å°åå主æºå°å两é¨åç»æã
- ç½ç»å°åç¨äºæ è¯è®¾å¤æå¨çç½ç»
- 主æºå°ååç¨äºæ è¯è®¾å¤å¨è¯¥ç½ç»ä¸çå ·ä½ä½ç½®
IPv4 å IPv6 é½æ¯ IP å°åçæ åï¼å®ä»¬çåºå«å¨äºï¼
- IPv4 ä½¿ç¨ 32 ä½äºè¿å¶æ°å表示 IP å°åï¼å°å空é´é常æéã
- IPv6 ä½¿ç¨ 128 ä½äºè¿å¶æ°å表示 IP å°åï¼ä¸»è¦è§£å³ IPv4 å°åç缺çé®é¢ã
02
为ä»ä¹è¦ä¼å IP å°åçåå¨æ¹å¼
å¨ MySQL ä¸ï¼IP å°ååå¨æ¹å¼çéæ©ï¼å°ç´æ¥å½±åå° MySQL çåå¨ç©ºé´åæ¥è¯¢é度ã
åå¨ç©ºé´
å¨ MySQL ä¸ï¼åå¨ IP å°åçæ°æ®ç±»åæå¤ç§éæ©ï¼ä¸åçæ°æ®ç±»åå ç¨çåå¨ç©ºé´ä¸åã
ä¾å¦ï¼ä½¿ç¨ CHAR æ VARCHAR ç±»ååå¨ IP å°åï¼å¯¼è´äºåå¨ç©ºé´å ç¨ãè¿æ¶æ们就éè¦å¯¹å ¶è¿è¡ä¼åï¼éè¿ä½¿ç¨ INT UNSIGNED æ BINARY ç±»åæ¥èçåå¨ç©ºé´ã
æ¥è¯¢é度
使ç¨ä¸åçæ°æ®ç±»åï¼æ¥è¯¢é度ã转æ¢é度ä¹ä¼æå·®å¼ã
PS. å¨ MySQL ä¸ï¼æ¥è¯¢æ¶éè¦å° IP å°å转æ¢æåè¿å¶æ°æäºè¿å¶æ°ã
ä½¿ç¨ INT UNSIGNED æ BINARY ç±»ååå¨ IP å°åçæ¥è¯¢é度快ï¼èä½¿ç¨ CHAR æ VARCHAR ç±»ååå¨ IP å°åçæ¥è¯¢é度就è¦ç¸å¯¹æ ¢ä¸äºã
éæ©éåç MySQL IP å°åæ°æ®ç±»åå¯ä»¥èçåå¨ç©ºé´ï¼å¹¶ä¸å¯ä»¥æé«æ¥è¯¢é度ã
03
常è§ç IP å°åæ°æ®ç±»å
å¨ MySQL ä¸ï¼æä¸ç§å¸¸è§ç IP å°åæ°æ®ç±»åï¼
- CHAR(n)
- VARCHAR(n)
- INT UNSIGNED
3.1 CHAR(n) / VARCHAR(n)
CHAR(n) / VARCHAR(n) ç±»åæ¯ä»ä¹
æ¯æ常è§çåå¨IPå°åçæ¹æ³ä¹ä¸ï¼é常使ç¨å®é¿æåé¿å符串æ¥åå¨ IP å°åï¼ä¾å¦ï¼VARCHAR(15) å¯ä»¥åå¨ä¸ä¸ª IPv4 å°åã
CHAR(n) / VARCHAR(n) ç±»åçä¼ç¹
- æ°æ®å¯è¯»æ§å¼ºï¼æäºç解åç»´æ¤ã
- åå¨è¾å°çIPv4å°åæ¶ï¼åå¨ç©ºé´å ç¨ä¸å¤§ã
CHAR(n) / VARCHAR(n) ç±»åç缺ç¹
- åå¨ IPv6å°åæ¶ï¼åå¨ç©ºé´å ç¨è¾å¤§ã
- æ¥è¯¢æ¶éè¦ä½¿ç¨å½æ°è½¬æ¢ä¸ºæ°åæäºè¿å¶æ ¼å¼ï¼ä¼éä½æ¥è¯¢é度ã
CHAR(n) / VARCHAR(n) ç±»åçåºç¨åºæ¯
CHAR(n) / VARCHAR(n) éç¨äºåå¨ IPv4 å°åï¼ä¾å¦ï¼åå¨ç¨æ·ç»å½ç IP å°åãç½ç«è®¿é®æ¥å¿ä¸ç IP å°åçã
示ä¾ï¼
CREATE TABLE user (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
ip_address VARCHAR(15) NOT NULL,
PRIMARY KEY (id)
);
3.2 INT UNSIGNED ç±»å
INT UNSIGNED ç±»åæ¯å¦ä¸ç§åå¨ IP å°åçæ¹æ³ï¼å®ä½¿ç¨ 32 ä½æ 符å·æ´æ°æ¥åå¨ IP å°åï¼å°æ¯ä¸ª IP å°å转æ¢ä¸ºä¸ä¸ªæ°åã
INT UNSIGNED ç±»åçä¼ç¹
- åå¨ç©ºé´å ç¨è¾å°ã
- æ¥è¯¢é度è¾å¿«ã
INT UNSIGNED ç±»åç缺ç¹
- åå¨ IPv6 å°åæ¶ï¼éè¦å ç¨ 64 ä½ç©ºé´ã
- æ°æ®å¯è¯»æ§è¾å·®ï¼ä¸æäºç解åç»´æ¤ã
INT UNSIGNED ç±»åçåºç¨åºæ¯
INT UNSIGNED éç¨äºåå¨ IPv4 å IPv6 å°åï¼ä¾å¦ï¼åå¨ç½ç»è®¾å¤é ç½®ç IP å°åãå°çä½ç½®ä¿¡æ¯çã
示ä¾ï¼
CREATE TABLE device (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
ip_address INT UNSIGNED NOT NULL,
PRIMARY KEY (id)
);
æ们å¨éæ©åå¨ IP å°åçæ¹æ³æ¶ï¼ä¾æ®å®é æ åµæ¥éæ©æåéçæ°æ®ç±»åã
- å¦æåªéè¦åå¨å°é IPv4 å°åï¼å¯ä»¥ä½¿ç¨ CHAR(n) / VARCHAR(n) ç±»åã
- å¦æéè¦åå¨å¤§é IPv4 æ IPv6 å°åï¼åºè¯¥éæ© INT UNSIGNED ç±»åã
3.3 BINARY(4) / VARBINARY(4)
BINARY(4) / VARBINARY(4) çä¼ç¼ºç¹
BINARY(4) / VARBINARY(4) æ°æ®ç±»åæ¯ä¸ç§æ¯è¾æ°é¢ç IP å°ååå¨æ¹å¼ã
ä¸åé¢ä»ç»ç CHAR å INT æ°æ®ç±»åç¸æ¯ï¼BINARY(4) / VARBINARY(4) æ°æ®ç±»åå ç¨åå¨ç©ºé´å°ï¼æ¥è¯¢é度ä¹å¾å¿«ã
ä¸ INT æ°æ®ç±»åç¸æ¯ï¼BINARY(4) / VARBINARY(4) æ°æ®ç±»åä¹æ¯æ IPv6 å°åã
BINARY(4) / VARBINARY(4) çåºç¨åºæ¯
åºäº BINARY(4) / VARBINARY(4) æ°æ®ç±»ååå¨ç©ºé´å ç¨å°ãæ¥è¯¢é度快çç¹æ§ï¼å®æ´éç¨äºåå¨å¤§é IP å°åçåºæ¯ã
ä¾å¦ï¼
å¨æäºæ°æ®ç»è®¡åºæ¯ä¸ï¼éè¦å¯¹å¤§éçç¨æ· IP å°åè¿è¡ç»è®¡åæï¼è¿æ¶åæä»¬ä½¿ç¨ BINARY(4) / VARBINARY(4) æ°æ®ç±»åå¯ä»¥ææåå°åå¨ç©ºé´ï¼åæ¶æé«æ¥è¯¢æçã
示ä¾ï¼ä½¿ç¨ BINARY(4) æ°æ®ç±»ååå¨ IPv4 å°å
CREATE TABLE `user_login` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(32) NOT NULL,
`ip_address` BINARY(4) NOT NULL,
`login_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `user_login` (`username`, `ip_address`)
VALUES ('user1', INET_ATON('192.168.1.1'));
SELECT `username`, INET_NTOA(`ip_address`) AS `ip_address`, `login_time`
FROM `user_login`
WHERE `ip_address` = INET_ATON('192.168.1.1');
ä¸é¢ç示ä¾ä¸ï¼ip_address å段使ç¨äº BINARY(4) æ°æ®ç±»åæ¥åå¨ IPv4 å°åï¼åæ¶ä½¿ç¨äº INET_ATON() å½æ°å INET_NTOA() å½æ°æ¥è¿è¡ IP å°ååäºè¿å¶æ°æ®ç转æ¢ã
3.4 å¦ä½éæ©æéå IP å°ååå¨æ¹å¼ï¼
å¨éæ© IP å°ååå¨æ¹å¼æ¶ï¼æ们éè¦ç»¼åèè以ä¸ä¸¤ä¸ªå ç´ ã
åå¨ç©ºé´å¤§å°
åå¨ç©ºé´æ¯éè¦èèçéè¦å ç´ ä¹ä¸ã
IP å°åé常åå¨ä¸ºå个æ´æ°ï¼åå¨ç©ºé´å¯ä»¥éè¿åå°æ¯ä¸ªæ´æ°çåå¨ä½æ°æ¥è¿è¡ä¼åã
ä¸ææ们äºè§£å° BINARY(4) / VARBINARY(4) æ¯åå¨ IP å°åæå°çæ°æ®ç±»åï¼CHAR(n) / VARCHAR(n) æ¯åå¨ç©ºé´æ大çæ°æ®ç±»åã
å¦æç¯å¢éè¦åå¨å¤§éç IP å°åï¼å°±åºè¯¥éæ©å ç¨æ´å°åå¨ç©ºé´çæ°æ®ç±»åã
å¨åå¨ç©ºé´åéçç¯å¢ä¸ï¼ä¾å¦ç§»å¨è®¾å¤æåµå ¥å¼ç³»ç»ï¼BINARY(4) / VARBINARY(4) æ¯é¦éçæ°æ®ç±»åã
æ¥è¯¢é度å¦ä½
ä¸è¬æ åµä¸ï¼æ¥è¯¢é度ä¸æ°æ®ç±»åçåå¨æ¹å¼æå ³ã
åé¢æ们已ç»ä»ç»äºï¼INT UNSIGNEDåBINARY(4) / VARBINARY(4) æ¯ CHAR(n) / VARCHAR(n) æ¥è¯¢é度æ´å¿«ã
å¦æåºæ¯ä¸éè¦é¢ç¹å°æ¥è¯¢ IP å°åï¼å°±è¦éæ©æ¥è¯¢é度æ´å¿«çæ°æ®ç±»åãå¨éè¦è¿è¡å¤ææ¥è¯¢æèåæä½æ¶ï¼BINARY(4) / VARBINARY(4) çæ§è½è¡¨ç°ä¼æ´å¥½ã
æ¯æ IPv6
IPv6 æ¯ä¸ä¸ä»£äºèç½åè®®ï¼ä¸ IPv4 ç¸æ¯ï¼IPv6 æä¾äºæ´å¤ç IP å°åã
IPv6 å°åç± 8 个 16 ä½çæ´æ°è¡¨ç¤ºï¼å¯ä»¥ä½¿ç¨ BINARY(16) / VARBINARY(16) æ°æ®ç±»åè¿è¡åå¨ã
å¦æéè¦æ¯æ IPv6 å°åï¼å»ºè®®éæ© BINARY(16) / VARBINARY(16) æ°æ®ç±»åãå¦æéè¦æ¯æ IPv4 å°åï¼å建议éæ© BINARY(4) / VARBINARY(4) æ INT UNSIGNED æ°æ®ç±»åã
04
å¦ä½å° IP å°å转æ¢ä¸ºæ´æ°åå¨ï¼
å¨ MySQL ä¸ï¼å° IP å°å转æ¢ä¸ºæ´æ°åå¨ï¼å¯ä»¥è¿ä¸æ¥ä¼ååå¨åæ¥è¯¢é度ã
4.1 å°IP å°å转æ¢ä¸ºæ´æ°åå¨
ä¸é¢è¿ä¸ªç¤ºä¾å±ç¤ºäºå° IP å°å转æ¢ä¸ºæ´æ°åå¨çæ¹æ³ã
å°æ¯ä¸ª IP å°åå段转æ¢ä¸º 2 è¿å¶æ°ï¼å¹¶å°è¿äºäºè¿å¶æ°å并为ä¸ä¸ª 32 ä½çäºè¿å¶æ°ã
ä¾å¦ï¼IP å°åâ192.168.1.1âå¯ä»¥è½¬æ¢æäºè¿å¶æ°â11000000 10101000 00000001 00000001âï¼å®æ对åºçåè¿å¶æ´æ°æ¯â3232235777âã
示ä¾ï¼IP å°å转æ¢ä¸ºæ´æ°ç SQL
SELECT INET_ATON('192.168.1.1') as ip_integer;
è¿ä¸ª SQL è¯å¥å°è¿åæ´æ°â3232235777âã
4.2 å°æ´æ°è½¬æ¢ä¸º IP å°å
å° 32 ä½äºè¿å¶æ°å为 4 个 8 ä½äºè¿å¶æ°ï¼å¹¶å°æ¯ä¸ª 8 ä½äºè¿å¶æ°è½¬æ¢ä¸ºåè¿å¶æ°ï¼æç»å并为 IP å°åã
ä¾å¦ï¼æ´æ°â3232235777âå¯ä»¥è½¬æ¢ä¸ºIPå°åâ192.168.1.1âã
示ä¾ï¼å°æ´æ°è½¬æ¢ä¸º IP å°åç SQL
SELECT INET_NTOA(3232235777) as ip_address;
è¿ä¸ª SQL è¯å¥å°è¿å IP å°åâ192.168.1.1âã
æ´æ°åå¨ IP å°åï¼è¡¨ç»æå¦ä¸ï¼
CREATE TABLE users (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
ip_address INT UNSIGNED
);
å¨è¿ä¸ªç¤ºä¾ä¸ï¼IP å°å被åå¨ä¸ºæ´æ°ï¼ä½¿ç¨ INT UNSIGNED æ°æ®ç±»åã
å° IP å°å转æ¢ä¸ºæ´æ°å¹¶å°å ¶æå ¥å°è¡¨ä¸ç SQLï¼
INSERT INTO users (name, ip_address)
VALUES ('John', INET_ATON('192.168.1.1')),
('Mary', INET_ATON('10.0.0.1'));
è¿ä¸ª SQLè¯å¥å°è¿å IP å°å为â192.168.1.1âçç¨æ·çå§åã
å¯è§ï¼å° IP å°å转æ¢ä¸ºæ´æ°åå¨ï¼æ¯å¯ä»¥æé« MySQL ä¸ IP å°åçåå¨åæ¥è¯¢é度çã
å¦å¤ï¼æ们è¿å¯ä»¥ä½¿ç¨ MySQL æä¾çå½æ°ï¼å° IP å°ååæ´æ°ç¸äºè½¬æ¢ã
05
æ»ç»
éè¿æ¬æï¼æ们äºè§£å°äº IP å°åçå®ä¹åä½ç¨ãIPv4 å IPv6 çåºå«ãIP å°ååå¨æ¹å¼ï¼å¸¸è§ç ä¸ç§ IP å°åæ°æ®ç±»åCHAR(n) / VARCHAR(n)ãINT UNSIGNED å BINARY(4) / VARBINARY(4) ï¼å¯¹å¦ä½éæ©æ°æ®ç±»åçæäºæ´æ¸ æ°çç解ã
å¨å®é åºç¨ä¸ï¼éè¦ç»åæ°æ®ç±»åçç¹æ§ä»¥ååºç¨åºæ¯ç»¼åèèã
å¯è½æåå¦ä¼è¯´ï¼å¤§é¨åæ åµä¸ï¼èçè¿ç¹ç©ºé´åæçæ¯å¾®ä¸è¶³éçãä½æ¯ï¼å¦ææ们çè¿ç®æåå¨æ§è¡æ¯å å亿ãå ç¾äº¿æ¬¡å¢ï¼è¿ä¸ªæ¶åçä¸ä¸åç¹çä¼åæ¹è¿ï¼å°±è½å¸¦æ¥ææ¾çä¼åææã
ææ¯ç±å享çç¨åºåå®å¦¹å¿ï¼è°¢è°¢å ³æ³¨ Javaé¢è¯é¢å®ã
å¦æè§å¾ä¸éï¼è¯·ä¸é®ä¸è¿æ¯æä¸ã
--- end---