验证 sql/oracle 中的电子邮件/邮政编码字段

Posted

技术标签:

【中文标题】验证 sql/oracle 中的电子邮件/邮政编码字段【英文标题】:validation on email / postcode fields in sql/oracle 【发布时间】:2009-04-24 19:10:43 【问题描述】:

不胜感激以下方面的一些建议 - 是否可以通过 oracle 中的 sql 中的某种检查约束来验证电子邮件和邮政编码字段?还是我怀疑带有正则表达式的 pl/sql 之类的东西?

谢谢

【问题讨论】:

【参考方案1】:

这是电子邮件地址的正则表达式语法,包括引号

'[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]2,4'

因此,您可以在 where 子句或 regexp_substr() 中使用 regexp_like() 来检查您的字段是否包含有效的电子邮件地址。这是一个示例 - 您将看到 regexp_substr() 在缺少 .domain 的地址上返回 NULL,这会导致子字符串验证失败。从那里你可以围绕它建立一个检查约束,或者使用触发器(yuck)等来强制它。

SQL> desc email
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMAIL_ID                                           NUMBER
 EMAIL_ADDRESS                                      VARCHAR2(128)


SQL> select * from email;

  EMAIL_ID EMAIL_ADDRESS
---------- ----------------------------------------
         1 NEIL@GMAIL.COM
         2 JOE@UTAH.GOV
         3 lower_name@lower.org
         4 bad_address@missing_domaindotorg


SQL> @qry2
SQL> column email_address format a40
SQL> column substr_result format a30
SQL> SELECT  email_address
  2       ,  regexp_substr(email_address,'[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]2,4') substr_result
  3    FROM  email
  4  /

EMAIL_ADDRESS                            SUBSTR_RESULT
---------------------------------------- ------------------------------
NEIL@GMAIL.COM                           NEIL@GMAIL.COM
JOE@UTAH.GOV                             JOE@UTAH.GOV
lower_name@lower.org                     lower_name@lower.org
bad_address@missing_domaindotorg

使用相同的数据,这里是一个只限制有效电子邮件地址的查询,使用 REGEXP_LIKE

SQL> column email_address format a40
SQL> column substr_result format a30
SQL> SELECT  email_address
  2    FROM  email
  3   WHERE  REGEXP_LIKE (email_address, '[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]2,4');

EMAIL_ADDRESS
----------------------------------------
NEIL@GMAIL.COM
JOE@UTAH.GOV
lower_name@lower.org

在SQL Reference的内容页面中搜索正则表达式以查看正则表达式支持。

【讨论】:

该正则表达式不适用于使用 .museum 和 .travel TLD 的电子邮件地址。 counsel@Lawrence@Andrea.com 通过这个正则表达式,不应该【参考方案2】:

一个更好的正则表达式是:

^[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]2,4$

(给出相同的表达式,但锚定在行的开始(^)和结束($))

没有锚点,像'test1@hotmail.com some other text'这样的表达式 将被验证,如果您尝试验证一封电子邮件, 上面的字符串不应该验证

注意:电子邮件应事先修剪,以便前导或尾随空格 不会搞砸验证。

希望对你有帮助,

【讨论】:

【参考方案3】:

注意'.' 字符:这是一个小丑(如SQL 语法中的*%)。 您必须使用'\' 来解决它。

这是我用来匹配RFC2822 的正则表达式(可能不是所有情况:)):

'^[a-zA-Z0-9!#$%''\*\+-/=\?^_`\|\~]+@[a-zA-Z0-9._%-]+\.[a-zA-Z]2,4$'

【讨论】:

【参考方案4】:

如果您只关心美国,您可以获取多个邮政编码来源,以平面文件格式获取并导入到表中,然后将地址中的外键约束应用于该表。

可以将电子邮件地址与正则表达式(需要 10g 或更高版本)进行匹配以验证格式,但检查它们是否是实际地址是一项困难得多的任务。

【讨论】:

谢谢,这很有帮助 - 我刚刚发现了一些与您的 10g 或更高版本的 reg 表达式检查提示相关的 Oracle 信息 - oracle.com/technology/oramag/webcolumns/2003/techarticles/… @oej 上面的链接已被删除【参考方案5】:

正如其他人所提到的,您可以使用正则表达式来验证电子邮件,但准确性有限。您可能会发现使用Real Email 之类的服务来验证电子邮件会更好,它不仅会检查电子邮件是否正确,还会检查域和帐户是否有效。

您可以将数据导出为 csv,然后对其进行验证。更多信息请见How to validate emails in an sql database。

【讨论】:

【参考方案6】:
declare

-- where customer is the table in my case

email_input customer.email%type;

begin

    email_input:=:EMAIL; 
    IF email_input is not null
    AND email_input not like '%@%.COM' then
        message('Please enter a valid email address!');
        message('   ');
        clear_message;
        :EMAIL:=null;
        raise form_trigger_failure;
    end if;
end;    

【讨论】:

以上是关于验证 sql/oracle 中的电子邮件/邮政编码字段的主要内容,如果未能解决你的问题,请参考以下文章

php正则表达式验证(邮件地址Url地址电话号码邮政编码)

领域驱动设计中的验证

C# 如何验证来自电子邮件的数字签名(编码 SeveBit)

如何验证我使用 bootstrap 3 创建的表单?

表单 验证,手机 ,QQ,电子邮箱,数字,邮政编码,身份证,手机号 & 电话

相关模型和验证