使用 SQL 确定子网掩码的 cidr 值
我想找到一种方法来执行 SQL 查询,该查询将计算存储在数据库中的子网掩码的 cidr(位表示)。 例如,我在数据库中存储了 255.255.255.0 或其十进制值 (4294967040)。 我想通过查询进行选择并返回 /24 表示。
我已经执行了类似以下操作来确定子网的最后一个 IP,因此我希望执行类似的操作来确定掩码的 cidr 表示形式。
select concat(inet_ntoa(ip_addr),'-',
inet_ntoa(ip_addr+(POWER(2,32)-ip_mask-1))) range
from subnets
order by ip_addr
最好是在 mysql、postgres、oracle 等下运行的 SQL 语句。
I'd like to find a way to do a SQL query that will calculate the cidr (bit representation) of a subnet mask stored in the database. So for example, I've got either 255.255.255.0 or its decimal value (4294967040) stored in the database. I'd like to do a select and get back /24 representation via the query.
I've done things like the following to determine the last IP of a subnet so I'm hoping to do something similar to determine the cidr representation of a mask.
select concat(inet_ntoa(ip_addr),'-',
inet_ntoa(ip_addr+(POWER(2,32)-ip_mask-1))) range
from subnets
order by ip_addr
Preferably this would be a SQL statement that would work under mysql, postgres, oracle etc.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我想我已经找到了解决我的问题的方法。 这是我所做的:
基本上我采用十进制掩码并从最大十进制值中减去它。 然后我对该值进行 log2 以获得对数值。 然后只需从 32(可用的最大位)中减去该值即可。
希望对其他人有帮助。
谢谢
I think I have found the solution to my issue. Here is what I have done:
Basically I take my decmial mask and subtract it from the maximum decimal value. I then to a log2 on that value to get the logarithm value. Then simply subtract that from 32 (the maximum bit available).
Hope that helps others.
Thanks
SQL 查询没有过程循环构造(尽管有过程语言),但您可以将一组行与另一组行进行比较,这有点像循环。
您只有 32 个可能的子网掩码。 在这种情况下,创建一个小表来存储这 32 个掩码和关联的 CIDR 编号是有意义的。
SQL queries don't have a procedural looping construct (notwithstanding procedural language), but you can compare one set of rows to another set of rows, which is kind of like a loop.
You only have 32 possible subnet masks. In cases like this, it makes sense to create a small table that stores these 32 masks and the associated CIDR number.
例如,您需要将
255.255.255.252
网络掩码转换为位掩码。我总是使用这个简单的查询(PostgreSQL):
虽然不是那么好,但它很短并且工作起来很有魅力。
e.g. you need to convert
255.255.255.252
netmask into bit mask.I always use this simple query (PostgreSQL) :
not as nice as could be, but it's short and working like a charm..