【发布时间】:2019-10-13 03:27:49
【问题描述】:
我正在尝试创建一个包含电子邮件地址列的表格,并希望确保只允许格式正确的地址(包含“@”)。我知道如何在查询中使用LIKE 运算符,但不知道如何在列上设置值约束。
【问题讨论】:
标签: sql tsql constraints
我正在尝试创建一个包含电子邮件地址列的表格,并希望确保只允许格式正确的地址(包含“@”)。我知道如何在查询中使用LIKE 运算符,但不知道如何在列上设置值约束。
【问题讨论】:
标签: sql tsql constraints
您可以像这样添加检查约束对于您的基本示例:
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)
);
这仍然允许无效电子邮件,但至少更接近。
【讨论】:
在支持正则表达式或已经内置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 函数的经验,所以我尝试给你写一个代码示例可能是不负责任的(特别是因为在我发布这个答案之前我真的没有测试环境来检查它) ,但我希望到目前为止我所写的内容足够有帮助,并且借助此答案中的链接和一些网络搜索,您将能够解决问题。
【讨论】: