首页 > 数据库 > 数据库开发技术 > 如何利用 SQL 模式匹配验证电子邮箱的合法性?
| 模式匹配 | MySQL | Oracle | SQL Server | PostgreSQL | SQLite |
|---|---|---|---|---|---|
| LIKE 运算符 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 正则表达式 | REGEXP_LIKE() | REGEXP_LIKE() | ~ |
CREATE TABLE test (
email VARCHAR(50)
);
INSERT INTO test VALUES ('TEST@qq.com');
INSERT INTO test VALUES ('test@qq');
INSERT INTO test VALUES ('.123@qq.com');
INSERT INTO test VALUES ('test+email@sina.cn');
INSERT INTO test VALUES ('me.qq.com');
INSERT INTO test VALUES ('123.test@sql.org');
以字母或者数字开头,后面跟一个或者多个字母、数组或特殊字符( . _ - );
然后是一个 @ 字符;
接着是一个或者多个字母、数组或特殊字符( . - );
最后是域名,即 . 以及 2 到 4 个字母。
^[a-zA-Z0-9]+[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$
下划线(_)匹配一个任意字符;
百分号(%)匹配零个或者多个任意字符。
select email
from test
where email like 'test%';
-- MySQL、SQL Server 和 SQLite
email |
------------------|
TEST@qq.com |
test@qq |
test+email@sina.cn|
-- Oracle 和 PostgreSQL
EMAIL |
------------------|
test@qq |
test+email@sina.cn|
select email
from test
where email like '____@%';
email |
-----------|
TEST@qq.com|
test@qq |
.123@qq.com|
'60%' like '60!%' escape '!' -- 匹配
'60%' like '60\%' -- 匹配
'60@' like '60!%' escape '!' -- 不匹配
MySQL 和 SQLite 允许对数字类型进行模式匹配:10 LIKE '1%';
Oracle 提供了LIKEC、LIKE2、LIKE4用于不同字符集的字符匹配;
SQL Server 支持使用 [ ] 匹配某个范围内的字符,[^ ] 匹配某个范围之外的字符;
PostgreSQL 提供了不区分大小写的ILIKE运算符;
SQLite 提供了区分大小写的编译选项PRAGMA case_sensitive_like = true;,同时还提供了基于 Unix 文件路径匹配的 GLOB 运算符。
-- SQL Server
select email
from test
where email like '[0-9]%';
email |
----------------|
123.test@sql.org|
REGEXP_LIKE(expr, pat[, match_type])
c:区分大小写;
i:不区分大小写;
m:多行模式,^ 和 $ 能够匹配字符串中的行终止符。默认情况下它们只匹配 expr 的开头和结尾;
n:字符 . 能够匹配行终止符。默认情况下 . 遇到行尾将会匹配;
u:只匹配 Unix 行终止符,只有换行符(\n)能够匹配 .、^ 以及 $。
select email
from test
where regexp_like(email, '^[a-z0-9]+[a-z0-9._-]+@[a-z0-9.-]+\\.[a-z]{2,4}$');
email |
----------------|
TEST@qq.com |
123.test@sql.org|
expr REGEXP pat
expr RLIKE pat
REGEXP_LIKE(source_char, pattern[, match_param ])
c 表示区分大小写和重音;
i 表示不区分大小写和重音;
n 表示符号 . 能够匹配换行符(\n)。默认情况下不匹配换行符;
m 表示多行模式,^ 和 $ 能够匹配字符串中的任何行的开始和结尾,而不仅仅是整个字符串的开头和结尾;
x 表示忽略模式中的空白字符,默认情况下空白字符匹配它们自身。
select email
from test
where regexp_like(email, '^[a-z0-9]+[a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4}$', 'i');
email |
----------------|
TEST@qq.com |
123.test@sql.org|
expr ~ pattern,正则表达式匹配,区分大小写;
expr ~* pattern,正则表达式匹配,不区分大小写;
expr !~ pattern,不匹配正则表达式,区分大小写;
expr !~* pattern,不匹配正则表达式,区分大小写。
select email
from test
where email ~* '^[a-z0-9]+[a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4}$';
email |
----------------|
TEST@qq.com |
123.test@sql.org|
原文作者:SQL编程思想;如有侵权,请联系管理员删除。