我正在 db2 中创建一个数据库,我想添加一个约束来验证用户是否插入了包含 %@%.% 的有效电子邮件地址。没有运气......有什么建议吗?
问问题
33715 次
3 回答
14
您可以将 LIKE 与通配符一起使用。有关 DB2 的通配符,请参见此处。
下划线字符 (_) 表示任何单个字符。
百分号字符 (%) 表示零个或多个字符的字符串。
SELECT email
FROM YourTable
WHERE email NOT LIKE '%_@__%.__%'
这将忽略以下情况(有效电子邮件的简单版本):
- @ 前至少有一个字符的电子邮件;
- @ 和 . 之间至少有两个字符的电子邮件;
- 之间至少有两个字符的电子邮件。和结束。
您可以在sqlfiddle的 MySql 中看到一个示例。
要将其添加为约束,您可以这样做(正如 mustaccio 在评论中所说):
alter table your_table add constraint chk_email check (email like '%_@__%.__%')
于 2013-10-03T09:12:41.223 回答
0
您可以创建一个触发器,使用描述电子邮件结构的正则表达式检查给定字符串
^[A-Za-z0-9]+@[A-Za-z0-9]+.[A-Za-z0-9]+$
但是,电子邮件的正则表达式并不容易定义:使用正则表达式验证电子邮件地址
DECLARE RET VARCHAR(32);
SET RET = XMLCAST (
XMLQUERY ('fn:matches($TEXT,"^[A-Za-z0-9]+@[A-Za-z0-9]+.[A-Za-z0-9]+$")'
PASSING TEXT AS "TEXT"
) AS VARCHAR(32));
一旦你有了 RET 的值(真或假),你就可以在触发器中做一些事情。
您可以从命令行测试要使用的正则表达式:
db2 "xquery fn:matches(\"johndoe@mail.com\",\"^[A-Za-z0-9]+@[A-Za-z0-9]+.[A-Za-z0-9]+$\")"
于 2013-10-03T09:09:06.070 回答
0
确保仅 @ 不会是验证电子邮件地址的理想检查。
验证可以类似于
SELECT Email FROM YourTable WHERE email NOT REGEXP_LIKE(Email, '^[a-zA-Z0-9][a-zA-Z0-9._-]*@[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,4}$')
或者您甚至可以进行更简单的验证以减少误报并加快运行速度
SELECT Email FROM YourTable WHERE Email NOT LIKE '%_@__%.__%'
于 2020-05-04T05:18:48.083 回答