mySQL计算IP地址范围(掩码16-30位)
DELIMITER //
CREATE PROCEDURE IPJS(IN ipadd VARCHAR(16) , IN mask INT )
BEGIN
DECLARE i INT DEFAULT 0 ;
DECLARE k INT DEFAULT 0 ;
DECLARE l INT DEFAULT 0 ;
DECLARE x INT DEFAULT 0 ;
DECLARE y INT DEFAULT 0 ;
DECLARE z INT DEFAULT 0 ;
IF INET_ATON(ipadd) IS NULL && mask > 30 THEN SELECT 'IP格式不正确或掩码错误' ;
ELSEIF INET_ATON(ipadd) IS NOT NULL
THEN
SET i = INSTR(SUBSTRING_INDEX(ipadd , '.', -2) , '.') ;
SET k = SUBSTRING(SUBSTRING_INDEX(ipadd , '.', -2), 1 , i-1) ;
SET l = SUBSTRING(SUBSTRING_INDEX(ipadd , '.', -2), i+1 , i+3) ;
SET x = SUBSTRING_INDEX(ipadd , '.', 1) ;
SET y = SUBSTRING_INDEX(SUBSTRING_INDEX(ipadd , '.', -3) , '.', 1) ;
IF mask = 24 THEN SELECT CONCAT( x,'.',y,'.',k , '.' , (0&l)+1 , '-' ,x,'.',y,'.',k , '.' , 255-1) as 'IP所属地址范围 ' ;
ELSEIF mask = 25 THEN SELECT CONCAT( x,'.',y,'.',k , '.' , (128&l)+1 , '-' ,x,'.',y,'.',k , '.' ,(128&l)+126 ) as 'IP所属地址范围 ' ;
ELSEIF mask = 26 THEN SELECT CONCAT( x,'.',y,'.',k , '.' , (192&l)+1 , '-' ,x,'.',y,'.',k , '.' ,(192&l)+62 ) as 'IP所属地址范围 ' ;
ELSEIF mask = 27 THEN SELECT CONCAT( x,'.',y,'.',k , '.' , (224&l)+1 , '-' ,x,'.',y,'.',k , '.' ,(224&l)+30 ) as 'IP所属地址范围 ' ;
ELSEIF mask = 28 THEN SELECT CONCAT( x,'.',y,'.',k , '.' , (240&l)+1 , '-' ,x,'.',y,'.',k , '.' ,(240&l)+14 )as 'IP所属地址范围 ' ;
ELSEIF mask = 29 THEN SELECT CONCAT( x,'.',y,'.',k , '.' , (248&l)+1 , '-' ,x,'.',y,'.',k , '.' ,(248&l)+6 ) as 'IP所属地址范围 ' ;
ELSEIF mask = 30 THEN SELECT CONCAT( x,'.',y,'.',k , '.' , (252&l)+1 , '-' ,x,'.',y,'.',k , '.' ,(252&l)+2) as 'IP所属地址范围 ' ;
ELSEIF mask = 16 THEN SELECT CONCAT( x,'.',y,'.',0&k , '.' , 1 , '-' ,x,'.',y,'.',255 , '.' ,254 ) as 'IP所属地址范围 ' ;
ELSEIF mask = 17 THEN SELECT CONCAT( x,'.',y,'.',128&k , '.' , 1 , '-' ,x,'.',y,'.',(128&k)+127, '.' ,254) as 'IP所属地址范围 ' ;
ELSEIF mask = 18 THEN SELECT CONCAT( x,'.',y,'.',192&k , '.' , 1 , '-' ,x,'.',y,'.',(192&k)+63 , '.' ,254) as 'IP所属地址范围 ' ;
ELSEIF mask = 19 THEN SELECT CONCAT( x,'.',y,'.',224&k , '.' , 1 , '-' ,x,'.',y,'.',(224&k)+31 , '.' ,254) as 'IP所属地址范围 ' ;
ELSEIF mask = 20 THEN SELECT CONCAT( x,'.',y,'.',240&k , '.' , 1 , '-' ,x,'.',y,'.',(240&k)+15 , '.' ,254) as 'IP所属地址范围 ' ;
ELSEIF mask = 21 THEN SELECT CONCAT( x,'.',y,'.',248&k , '.' , 1 , '-' ,x,'.',y,'.',(248&k)+7 , '.' ,254) as 'IP所属地址范围 ' ;
ELSEIF mask = 22 THEN SELECT CONCAT( x,'.',y,'.',252&k , '.' , 1 , '-' ,x,'.',y,'.',(252&k)+3 , '.' ,254) as 'IP所属地址范围 ' ;
ELSEIF mask = 23 THEN SELECT CONCAT( x,'.',y,'.',254&k , '.' , 1 , '-' ,x,'.',y,'.',(254&k)+1 , '.' ,254) as 'IP所属地址范围 ' ;
END IF ;
END IF;
END //
DELIMITER ;
|