2017-05-08 16 views
8

Tôi có một bảng các Dải IP và tôi cần tạo một danh sách các mạng để từ chối cho một quốc gia cụ thể.Chọn CIDR từ Phạm vi IP trong MySQL

Vì vậy, tôi có thể tạo danh sách các phạm vi ip từ db của tôi bằng cách sử dụng này.

SELECT 
     ip_from, 
     Inet_ntoa(ip_from), 
     ip_to, 
     Inet_ntoa(ip_to) 
FROM 
     ip_address_data 
WHERE 
     country_code = 'XX' 
LIMIT 1 

mà tạo ra kết quả này

ip_from  inet_ntoa(ip_from) ip_to  inet_ntoa(ip_to) 
16777472 1.0.1.0    16778239 1.0.3.255 

Nhưng tôi cần đầu ra ở định dạng CIDR và ​​đôi khi phạm vi sẽ được nhiều hơn một hàng trở lại như thế này.

1.0.1.0/24 
1.0.2.0/23 

Có cách nào để tạo động bằng cách sử dụng câu lệnh chọn không? Cú pháp này sẽ là tuyệt vời nhưng tôi giả sử nó sẽ phải là một thủ tục được lưu trữ nếu nó sẽ trả về nhiều hơn một hàng đầu ra cho mỗi hàng đầu vào.

SELECT 
    CONCAT('/sbin/route add -net ', CONVERT_TO_CIDR(ip_from,ip_to), ' reject;') AS command 
FROM 
    ip_info.ip_address_data 
WHERE 
    country_code='XX' 
+1

lý do tại sao downvote? Lý do của bạn không hoạt động. Tôi không tìm kiếm ý kiến ​​này là một vấn đề toán học đơn giản mà tôi cần giúp đỡ. – jbrahy

+0

Cuộc trò chuyện này có thể giúp http://stackoverflow.com/questions/595748/is-there-way-to-match-ip-with-ipcidr-straight-from-select-query?rq=1 –

Trả lời

3

Đây là tập lệnh python để thực hiện chuyển đổi. Chỉ cần chuyển đổi nó thành một thủ tục lưu sẵn.

Conversion from IP Range to CIDR Mask

+0

Cảm ơn, điều này có vẻ hữu ích . – jbrahy

+0

Hãy cho chúng tôi biết có bao nhiêu dòng SP được so sánh với Python. –

Các vấn đề liên quan