大家好,这是我的第一篇文章
过去两天我在这里努力实施ipv4地址验证.... 问题是验证应该在数据库级别执行,这使像我这样的noob很难
所以我必须做出:
我在触发器中到目前为止所拥有的内容:
这不应该按原样运作,所以我要求你们帮忙......谢谢!!!
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;
答案 0 :(得分: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])$'
;
(注意:我自己从未使用过触发器。因此无法为您提供现成的代码。但您可以使用此示例来触发它)
我认为第2部分的解决方案是一个简单的查找和替换。同样,REGEXP可用于匹配0
,00
,.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
-----------------------------
更新3:
我认为this 的Michael Berkowski解决方案非常棒
答案 1 :(得分:1)
有一些预先实现的功能可以检查IP地址的有效性。 请检查https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html
只需调用IS_IPV4()