MySQL IPv4验证实现

时间:2013-11-13 16:44:02

标签: mysql ipv4

大家好,这是我的第一篇文章

过去两天我在这里努力实施ipv4地址验证.... 问题是验证应该在数据库级别执行,这使像我这样的noob很难

所以我必须做出:

  1. 验证ipv4地址
  2. 如果ip中某处的前缀是0,我必须将其删除(例如:123.013.221.011 应该成为123.13.221.11)
  3. 我在触发器中到目前为止所拥有的内容:

    这不应该按原样运作,所以我要求你们帮忙......谢谢!!!

    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;
    

2 个答案:

答案 0 :(得分:1)

这是一个建议。考虑将此功能实现为User Defined Functions (or UDF)。这样您就可以在cc++而不是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可用于匹配000.0.00的所有模式,并替换为.(或者如果没有,则为字符串的开头)

更新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
-------------

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

更新3:

我认为this Michael Berkowski解决方案非常棒

答案 1 :(得分:1)

有一些预先实现的功能可以检查IP地址的有效性。 请检查https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html

只需调用IS_IPV4()