【问题标题】:Struggling with input validation/check constraint苦苦挣扎于输入验证/检查约束
【发布时间】:2019-10-13 03:27:49
【问题描述】:

我正在尝试创建一个包含电子邮件地址列的表格,并希望确保只允许格式正确的地址(包含“@”)。我知道如何在查询中使用LIKE 运算符,但不知道如何在列上设置值约束。

【问题讨论】:

标签: sql tsql constraints


【解决方案1】:

您可以像这样添加检查约束对于您的基本示例:

alter table t add contraint chk_email
    (check (email like '%@%') );

当然,这实际上只是一个赌注。也许更像这样:

alter table t add contraint chk_email
    (check (email like '%_@[^.]%' and               -- one @ and something before and after
            email not like '%@%@%' and         -- not more than one @
            email not like '%[^-.a-zA-Z0-9_]%'  -- valid characters)
    );

这仍然允许无效电子邮件,但至少更接近。

【讨论】:

    【解决方案2】:

    在支持正则表达式或已经内置isValidEmail 方法的编程语言中这样做会更好。

    使用正则表达式或简单的like 模式验证电子邮件地址非常困难,即使不是几乎不可能。

    您可以在 I Knew How To Validate An Email Address Until I Read The RFC 上阅读更多相关信息 - 引用我认为最能说明问题的部分:

    这些都是有效的电子邮件地址!

    • Abc@def@example.com
    • Fred\ Bloggs@example.com
    • Joe.\Blow@example.com
    • “Abc@def”@example.com
    • “Fred Bloggs”@example.com
    • customer/department=shipping@example.com
    • $A12345@example.com
    • !def!xyz%abc@example.com
    • _somename@example.com

    尝试获取验证 T-SQL 语句中如此广泛的可能性所需的所有逻辑,就像双手绑在背后尝试蒙着眼睛攀登珠穆朗玛峰。

    您可以使用简单的like 模式进行简单的验证,该验证可能会返回大量误报或误报,就像 Pinal Dave 在How to Validate Email Address in SQL Server? 中建议的那样:'%_@__%.__%',但这实际上只是一个天真地试图用创可贴堵塞水坝。

    说了这么多,您也许可以使用CLR Scalar-Valued Function 来验证您的电子邮件地址,使用类似this SO post 的代码。

    就我个人而言,我没有使用 CLR 函数的经验,所以我尝试给你写一个代码示例可能是不负责任的(特别是因为在我发布这个答案之前我真的没有测试环境来检查它) ,但我希望到目前为止我所写的内容足够有帮助,并且借助此答案中的链接和一些网络搜索,您将能够解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多