我有一个表,其中包含一列作为CIDR值,例如1.0.85.128/25
,我还有其他2列(start_ip_range和end_ip_range),我想填充这2列FROM
CIDR列
Java代码可能如下所示:
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查询。
你可以这样转换
询问
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');
或者,您可以在虚拟列中使用它。因此,您可以直接获得正确的值。
虚拟领域
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 []>
问题内容: 关于我之前的问题ElasticSearchQuery,其中给出了映射和doc示例,我想将此MySql查询转换为Elasticsearch。这是mysql查询 期待您的帮助 问题答案: 以下查询将为您提供帮助。请注意,在映射中,您已经提到了上述查询。 尽管如此,我还是利用了它,使其与映射保持一致。 我使用过术语查询,术语查询和多匹配查询的变体。 请注意,我已经在字段上使用了Term Qu
问题内容: 我正在使用mysql功能XOR(^)和BIT_COUNT()的Ruby应用程序上工作。但是,我现在需要在运行PyGreSQL的Heroku上运行该应用程序。 我找不到任何可以帮助我的PyGreSQL文档。 那么任何人都可以翻译此mysql查询,以便在pygresql数据库上执行时可以正常工作吗? pygresql给我错误 谢谢。 问题答案:
问题内容: 我需要将此查询从MySQL格式转换为SQLite。我正在尝试自己,但发现了一些困难。 在SQLite中,curdate()和interval函数不存在。 问题答案: 这是基本语法: 我忽略了该子句,因为这些日期是过去1000多个日期,因此他们无论如何都不会选择任何内容。
我使用了cakephp Mysql到mongodb查询组件,即将Mysql查询转换到mongodb中,但是当查询有多个括号时代码停止工作,我还尝试将http://www.querymongo.com/site上的查询转换为相同的问题,
问题内容: 我想从数据库中删除某些项目。我有以下查询: 这有效,并返回2个结果。 现在,我想将此查询转换为查询。但是,以下操作无效: MySQL引发以下错误: 1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的“ WHERE entry.sheetID = sheets.id ANDsheets.clientID = 13”附近使用 我在这里做错
问题内容: 这个问题已经在这里有了答案 : 8年前关闭。 可能重复: 在MySQL中为数值选择TOP X(或底部)百分比 我将如何在MySQL中编写此查询? 该表中的条目数将不断变化,因此我需要按百分比而不是固定数进行选择。 问题答案: 这实际上是一个重复的问题,但是我现在有一个更好的单次快速回答: