Oracle数据库中的电子邮件检查约束

3

我已经在各处搜索了一个合理且逻辑清晰的CHECK约束来验证电子邮件的格式是否正确。到目前为止,我找到的都是非常冗长和不必要的表达式,例如:

create table t (
email varchar2(320) check (
regexp_like(email, '[[:alnum:]]+@[[:alnum:]]+\.[[:alnum:]]')
 )
);

并且。
create table stk_t (
email varchar2(320) check (
email LIKE '%@%.%' AND email NOT LIKE '@%' AND email NOT LIKE '%@%@%'
 )
);

当然有更简单的方法。 我正在使用Oracle 11g数据库和SQL Developer IDE。 这是我的代码:
constraint Emails_Check check (Emails LIKE '%_@%_._%')

请问这是验证电子邮件地址最有效的方式吗?


5
电子邮件正则表达式中的大多数都比这个要长得多且更加复杂。请查看这里以开始思考这个问题。 - Tim Biegeleisen
我在这些表达式中没有看到任何“不必要”的东西。实际上相反:本地部分不能包含“@”;顶级域名必须至少由两个字母组成等等。你最终会得到一个更复杂的regexp_like。也许你更喜欢使用触发器而不是约束,这样你就可以使用PL/SQL来检查字符串,并在它不符合电子邮件地址规则时引发异常。 - Thorsten Kettner
验证电子邮件的“最有效方式”并不存在,但有些比其他方法更好,有些会产生太多误报,而其他一些则会产生太多漏报。 - Jeffrey Kemp
1
@ThorstenKettner,现在 TLD(顶级域名)可以有单个字母了 :) https://dev59.com/wWs05IYBdhLWcg3wJ-uQ - Jeffrey Kemp
实际上,在大多数情况下,这很少会成为问题。毕竟,无论如何,任何用于电子邮件验证的简单正则表达式都会有缺陷。 - Jeffrey Kemp
显示剩余3条评论
3个回答

2
你可以尝试这个。
email varchar2(255) check (
email LIKE '%@%.%' AND email NOT LIKE '@%' AND email NOT LIKE '%@%@%'   )

1
欢迎来到 Stack Overflow!在回答问题之前,请务必阅读现有的答案。实际上,该问题已经得到了解答。事实上,OP正在寻找更简单的解决方案。编写良好答案的一些指南可以在这里找到。 - dferenc

0
在互联网上寻找简单解决方案时,偶然发现了这个答案:
ALTER TABLE YourTableName
ADD CONSTRAINT YourConstraintName CHECK(YourColumnName LIKE '%___@___%.__%')

所有指向 @bhanu_nz 的点 在这里

0
CREATE TABLE MYTABLE(
  EMAIL VARCHAR2(30) CHECK(REGEXP_LIKE (EMAIL,'^[A-Za-z]+[A-Za-z0-9.]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$'))
)

Explanation of Regular Expression
^           #start of the line
  [_A-Za-z0-9-]+    #  must start with string in the bracket [ ], must contains one or more (+)
  (         #  start of group #1
    \\.[_A-Za-z0-9-]+   #     follow by a dot "." and string in the bracket [ ], must contains one or more (+)
  )*            #  end of group #1, this group is optional (*)
    @           #     must contains a "@" symbol
     [A-Za-z0-9]+       #        follow by string in the bracket [ ], must contains one or more (+)
      (         #      start of group #2 - first level TLD checking
       \\.[A-Za-z0-9]+  #        follow by a dot "." and string in the bracket [ ], must contains one or more (+)
      )*        #      end of group #2, this group is optional (*)
      (         #      start of group #3 - second level TLD checking
       \\.[A-Za-z]{2,}  #        follow by a dot "." and string in the bracket [ ], with minimum length of 2
      )         #      end of group #3
$           #end of the line

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接