本文介绍了MySQL查询将CIDR转换为IP范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个表,其中包含一列作为CIDR值,如1.0.85.128/25,我还有另外2列(start_ip_range和end_ip_range),我想填充那2列FROM CIDR列

I have a table which contains a column as CIDR values like 1.0.85.128/25, I have 2 other columns (start_ip_range and end_ip_range), I want to populate those 2 column FROM CIDR column

Java代码可能如下所示:

Java code might look like as follows:

String[] parts = cidr.split("/");
String ip = parts[0];
int prefix;
if (parts.length < 2) {
    prefix = 0;
} else {
    prefix = Integer.parseInt(parts[1]);
}

String[] ipParts = ip.split("\\.");
int address = ((new Integer(ipParts[0]) << 24) & 0xFF000000)
    | ((new Integer(ipParts[1]) << 16) & 0xFF0000)
    | ((new Integer(ipParts[2]) << 8) & 0xFF00)
    | (new Integer(ipParts[3]) & 0xFF);
int mask = (-1) << (32 - prefix);
int start = address & mask;
int end = start + (~mask);

如何将其转换为MySql查询.

How this can be transformed into MySql Query.

推荐答案

您可以进行转换

查询

SELECT
  INET_NTOA(INET_ATON( SUBSTRING_INDEX(val, '/', 1))
   & 0xffffffff ^ ((0x1 << ( 32 - SUBSTRING_INDEX(val, '/', -1))  ) -1 )) from_ip,
  INET_NTOA(INET_ATON( SUBSTRING_INDEX(val, '/', 1))
   | ((0x100000000 >> SUBSTRING_INDEX(val, '/', -1) ) -1 )) to_ip
FROM cidr;

样品表

CREATE TABLE `cidr` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `val` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `cidr` (`id`, `val`)
VALUES
    (1, '192.168.2.12/24'),
    (2, '192.168.2.12/25'),
    (3, '1.0.85.128/25'),
    (4, '192.168.2.12/32');

或者您可以在虚拟列中使用它.这样您就可以直接获得正确的值.

Or you can use it in virtual Columns. So you get direct the correct Value.

虚拟字段

CREATE TABLE `cidr1` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `val` VARCHAR(32) DEFAULT NULL,
  `from_ip` VARCHAR(15) AS ( INET_NTOA(INET_ATON( SUBSTRING_INDEX(val, '/', 1)) & 0xffffffff ^ ((0x1 << ( 32 - SUBSTRING_INDEX(val, '/', -1))  ) -1 ))) PERSISTENT ,
  `to_ip` VARCHAR(15)  AS ( INET_NTOA(INET_ATON( SUBSTRING_INDEX(val, '/', 1)) | ((0x100000000 >> SUBSTRING_INDEX(val, '/', -1) ) -1 ))) PERSISTENT ,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `cidr1` (`id`, `val`)
VALUES
    (1, '192.168.2.12/24'),
    (2, '192.168.2.12/25'),
    (3, '1.0.85.128/25'),
    (4, '192.168.2.12/32');


MariaDB []> select * from cidr1;
+----+-----------------+--------------+---------------+
| id | val             | from_ip      | to_ip         |
+----+-----------------+--------------+---------------+
|  1 | 192.168.2.12/24 | 192.168.2.0  | 192.168.2.255 |
|  2 | 192.168.2.12/25 | 192.168.2.0  | 192.168.2.127 |
|  3 | 1.0.85.128/25   | 1.0.85.128   | 1.0.85.255    |
|  4 | 192.168.2.12/32 | 192.168.2.12 | 192.168.2.12  |
+----+-----------------+--------------+---------------+
4 rows in set (0.00 sec)

MariaDB []>

这篇关于MySQL查询将CIDR转换为IP范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-24 01:17