旧版Informix中实现合规邮箱验证函数的方案咨询
在旧版Informix中实现邮箱验证函数的修正方案
你的现有代码存在几个关键问题,导致无法正确验证邮箱:
- 错误地用
NOT LIKE '%__@__%.__%'这类条件过滤了合法的长邮箱(比如abc@def.com会被误判为无效) - 没有检查邮箱中是否包含非法字符(比如逗号、Ü这类)
- 部分条件逻辑错误(比如
%@%_'无法有效防止域名结尾点的问题)
下面是符合你需求的修正后的函数代码,完全基于Informix的字符串函数和LIKE语法实现:
CREATE FUNCTION is_valid_email(email_param VARCHAR(255)) RETURNING INTEGER; DEFINE is_valid INTEGER; DEFINE at_pos INTEGER; DEFINE local_part VARCHAR(255); DEFINE domain_part VARCHAR(255); LET is_valid = 0; LET at_pos = INDEX(email_param, '@'); -- 基础格式检查:存在且仅存在一个@,长度足够,域名至少有一个点,无连续点 IF at_pos > 1 AND at_pos < LENGTH(email_param) - 2 -- 确保@后至少有两个字符(比如x.y) AND email_param NOT LIKE '%@%@%' AND email_param NOT LIKE '%..%' THEN LET local_part = SUBSTRING(email_param FROM 1 TO at_pos - 1); LET domain_part = SUBSTRING(email_param FROM at_pos + 1); -- 检查本地部分仅含字母数字 IF local_part NOT LIKE '%[^a-zA-Z0-9]%' -- 检查域名部分:不以点开头/结尾,仅含字母数字和点,且至少有一个点 AND domain_part NOT LIKE '.%' AND domain_part NOT LIKE '%.' AND domain_part LIKE '%.%' AND domain_part NOT LIKE '%[^a-zA-Z0-9.]%' THEN LET is_valid = 1; END IF; END IF; RETURN is_valid; END FUNCTION;
关键逻辑说明:
- 基础校验:先确保邮箱有且只有一个@,@不在开头或结尾,且没有连续的点
- 本地部分校验:用
NOT LIKE '%[^a-zA-Z0-9]%'排除所有非字母数字的字符 - 域名部分校验:
- 禁止以点开头或结尾
- 确保至少包含一个点(支持多级域名)
- 仅允许字母数字和点,排除非法字符(比如逗号、Ü这类不在
[a-zA-Z0-9.]范围内的字符)
你可以测试以下场景验证效果:
- 合法邮箱:
user123@domain.com、abc@sub.domain.co.uk - 非法邮箱:
user@domain.(域名结尾点)、user@..domain(连续点)、user,name@domain.com(含逗号)、Üser@domain.com(含特殊字符)、user@domain(无域名后缀点)
内容的提问来源于stack exchange,提问作者Martí Castell
相关产品推荐
相关产品推荐

