背景:我一开始是想匹配带数字的记录,但是习惯性打成了大写(将REGEXP '\d’打成REGEXP ‘\D’),MySQL是不区分大小写的,但是我不确定正则匹配中REGEXP中的匹配是否区分大小写,以下是关于REGEXP我遇到的几个问题
问题一:为什么SELECT ENAME, EMAIL FROM t_employee WHERE email REGEXP ‘\D’;
和
SELECT ENAME, EMAIL FROM t_employee WHERE email REGEXP '\d’返回结果不一样呢;
解答:
1、\D:
\D 是一个正则表达式模式,用于匹配任何非数字字符。
在正则表达式中,\ 表示转义字符,D 表示非数字字符(即除了数字0-9以外的任何字符)。
2、\d:
\d 是一个正则表达式模式,用于匹配任何数字字符。
在正则表达式中,\ 表示转义字符,d 表示数字字符(即0-9)。
示例:
假设 t_employee 表中有以下数据:
ENAME EMAIL
Alice alice@example.com
Bob bob123@example.com
Carol carol@example.com
查询 SELECT ENAME, EMAIL FROM t_employee WHERE email REGEXP ‘\D’;
这个查询会匹配所有包含非数字字符的 EMAIL 字段。
结果将是:
|-------|-----------------|
| Alice | alice@example.com |
| Carol | carol@example.com |
查询 SELECT ENAME, EMAIL FROM t_employee WHERE email REGEXP ‘\d’;
这个查询会匹配所有包含数字字符的 EMAIL 字段。
结果将是:
| Bob | bob123@example.com |
总结:
\D 匹配包含非数字字符的字符串。
\d 匹配包含数字字符的字符串。
因此,这两个查询返回的结果不同,因为它们匹配的模式不同。
通过上面尝试我初步认为REGEXP中的匹配是区分大小写的,我又试了下,但是却和想象中的不一样
问题二:
在这个表我尝试匹配不含有@ATGUIGU.COM的记录(我预想是应该有以@atguigu.com为后缀的记录的)
SELECT ENAME, EMAIL FROM t_employee WHERE email NOT REGEXP ‘@ATGUIGU.COM’;
但是运行结果:这不就相当于认为 @ATGUIGU.COM 与 @atguigu.com是一样的吗?不就是不区分大小写的了?我这个时候又认为或许只是\d和\D比较特殊呢,但是我用ai模型CodeGeex查了下,以下是查询结果:
在MySQL中,正则表达式默认是区分大小写的。因此,查询 SELECT ENAME, EMAIL FROM t_employee WHERE email NOT REGEXP ‘@ATGUIGU.COM’; 会匹配到所有不包含 @ATGUIGU.COM 的 EMAIL 字段。
然而,如果你希望进行不区分大小写的匹配,可以使用 (?i) 来启用不区分大小写的匹配
救命,这不就是说我以上想法并不对
怎么说呢,找大佬帮忙试了下是区分大小写的,灵异现象了属于,而且我用LIKE也是没有区分大小写,正常应该是区分的…
已经解决啦,原来是字符集编码规则的原因!!!!!!
敲重点:utf8mb4_0900_ai_ci不区分大小写
而我原来的表的字符集编码规则是utf8mb4_0900_ai_ci,将其以及其字段email的字符集编码规则修改为utf8mb4_bin
alter table t_employee character set utf8mb4 collate utf8mb4_bin;
ALTER TABLE t_employee MODIFY email varchar(32) CHARACTER SET utf8mb4 collate utf8mb4_bin;
重新运行之前有疑问的SELECT ENAME, EMAIL FROM t_employee WHERE email NOT REGEXP ‘@ATGUIGU.COM’;
就如期出现REGEXP与LIKE区分大小写的效果了!!!
所以就是字符集编码规则的问题!!!!!!!!