如何创建约束以检查电子邮件在postgres中是否有效?

时间:2011-04-16 21:24:51

标签: postgresql

如何创建约束以在postgres中使用正则表达式?

4 个答案:

答案 0 :(得分:46)

CREATE TABLE emails (
    email varchar
    CONSTRAINT proper_email CHECK (email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$')
);

(正则表达式可能不完整,您可以搜索正则表达式,以便在整个网络上进行电子邮件匹配,并选择您最喜欢的那个。)

答案 1 :(得分:19)

我建议使用现有的电子邮件地址解析模块,而不是编写自己的模式匹配。例如:

CREATE OR REPLACE FUNCTION check_email(email text) RETURNS bool
LANGUAGE plperlu
AS $$
use Email::Address;

my @addresses = Email::Address->parse($_[0]);
return scalar(@addresses) > 0 ? 1 : 0;
$$;

CREATE TABLE emails (
    email varchar
    CONSTRAINT proper_email CHECK (check_email(email))
);

答案 2 :(得分:3)

您还可以创建domain并在定义表格列时将其用作类型,例如

CREATE DOMAIN email AS TEXT CHECK (VALUE ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$');

CREATE TABLE emails (
    email email
);

这样,每次在数据库中使用包含列的电子邮件时,您都不需要重新定义正则表达式。

答案 3 :(得分:0)

更好的模式,取自OWASP regexp验证库,网址为 https://owasp.org/www-community/OWASP_Validation_Regex_Repository是:

/ ^ [a-zA-Z0-9 _ +&-] +(?:。[a-zA-Z0-9 _ +&-] +)* @(?:[a -zA-Z0-9-] +。)+ [a-zA-Z] {2,7} $ /

但这是相当有限的。它不支持注释或带引号的名称,也不支持通过电子邮件发送到有效的IP地址,例如name @ [10.99.22.4]。 UUCP电子邮件地址和许多其他电子邮件地址也有效。

https://emailregex.com/建议以下正则表达式:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

尽管我注意到没有锚(^ $)。