2013-11-13 3 views
3

Привет, ребята, это мой первый постMySQL IPv4 Validation реализации

Я борюсь здесь за последние два дня в осуществлении проверки для ipv4 адреса .... Проблема заключается в том, что проверка должна быть выполнена на уровне базы данных и это делает его трудным для нуба как я

Так что я должен сделать:

  1. Проверка ipv4 адреса
  2. Если префикс где-то в ф 0 я должен удалить его (например: 123.013.221.011 должен стать 123.13.221.11)

То, что я до сих пор в триггере:

Это не работает, как предполагается, поэтому я прошу вас, ребята за помощь ... спасибо !!!

DELIMITER $$ 
CREATE TRIGGER validation_trigger BEFORE INSERT ON setting_parameters 
FOR EACH ROW 
BEGIN 
-- PROXY RULES -- 
    IF(NEW.parameter_name LIKE '%proxy%') = true THEN 
    IF(INET_ATON(NEW.parameter_value)<INET_ATON('255.255.255.255'))=true THEN 
     IF(NEW.parameter_name LIKE '0%') = true THEN 
      SET NEW.parameter_value = SUBSTR(NEW.parameter_value,2); 
     ELSE 
      SIGNAL SQLSTATE '12345' 
      SET MESSAGE_TEXT = 'Wrong PROXY parameter values !'; 
     END IF; 
    END IF; 
    END IF; 

ответ

1

Вот предложение. Подумайте о реализации этой функции как User Defined Functions (or UDF). Это позволит вам написать код в c или c++, а не SQL.

В качестве альтернативы, вы можете использовать REGEXP support in MySQL.

Это решение для части 1 вашего вопроса:

Этот пример для проверки правильности IPV4 адреса с помощью REGEXP

SELECT '123.1.2.3' 
REGEXP '^([1-9]|[1-9][0-9]|1[013-9][0-9]|12[0-689]|2[0-4][1-9]|25[0-4])\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][1-9]|25[0-4])$' 
; 

SQL Fiddle Link

(Примечание: Я никогда не использовал запускает сам, поэтому не может дать вам готовый код. Но вы можете использовать этот пример, чтобы сделать из него триггер)

Я думаю, что решение для части 2 - это простая находка и замена. Здесь снова REGEXP может быть использован, чтобы соответствовать всем моделям 0, 00, .0, .00 и замените . (или ничего, если начало строки)

Update 2:

Вот SQL для удаления ведущих нулей. Мне не нужно было использовать REGEXP здесь, так как CAST() сделал волшебство!

SELECT ip, 
    CONCAT_WS('.',CAST(SUBSTRING_INDEX(ip,'.',1) as UNSIGNED), 
    CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(ip,'.',2),'.',-1) as UNSIGNED), 
    CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(ip,'.',-2),'.',1) as UNSIGNED), 
    CAST(SUBSTRING_INDEX(ip,'.',-1) as UNSIGNED)) as Converted_IP 
FROM ip_addr; 

Если ip_addr представляет собой таблицу с колонкой с именем ip и значения, как этот

-------------  
IP 
------------- 
127.0.0.1 
001.02.0.123 
1.23.123.000 
------------- 

The SQL Выведет:

----------------------------- 
IP    CONVERTED_IP 
----------------------------- 
127.0.0.1  127.0.0.1 
001.02.0.123 1.2.0.123 
1.23.123.000 1.23.123.0 
----------------------------- 

SQL Fiddle Link

Update 3:

Я думаю this решение по Michael Berkowski является удивительным

+0

Большое спасибо! Я дам ему выстрел и напишу! – user2988649

+0

Эй, регулярное выражение для ipv4 отлично работает ... к сожалению, я не могу заставить регулярное выражение find-replace для 00, .0 и .00 вы могли бы привести пример о том, как это сделать? спасибо большое время !! – user2988649

+0

Обновлен мой ответ с примером SQL для части 2. Посмотрите. – Litmus