正则表达式在MySQL5.7和MySQL8.0中的用法以及区别(三)

各位客官姥爷好,欢迎回来。我们上节给出了正则表达式在MySQL5.7与MySQL8.0中用法的区别(二),下面我们将继续正则表达式在Mysql数据库中使用系列内容。

准备工作

在之前的测试过程中,我们没有使用任何数据库表,在本节我们将创建一个test数据库,并在该数据库中创建一个user表。(5.7版本和8.0版本均进行以下过程)

1. 创建test数据库(需开启Mysql服务并成功登陆)

create database test;

2. 使用该数据库(光创建好了不行,得用起来,才能在这个数据库里创建表)

use test;

3. 创建user表

create table user(id int auto_increment primary key,name varchar(20) not null,age int not null,sex enum('female','male'));

4. 插入测试数据

insert into user(name,age,sex) values('清风',22,'male'),('John',30,'male'),('Lisa',23,'female'),('李清1',26,'male'),('李清2',26,'female'),('Bella',28,'female'),('すずらん',33,'female'),('さわやか風',20,'male');
select * from user;

到这里,测试数据就创建好了,下面我们开始正则表达式部分内容吧。

元字符

1. [\u4e00-\u9fa5]:unicode编码汉字

    5.7版本

既然这里是unicode编码,那么我们先通过建表语句看下5.7版本的默认字符编码。

show create table user\G

可以看到这里是utf8,而utf8是unicode编码的一种,这样看起来似乎用[\u4e00-\u9fa5]去匹配汉字是没毛病的。

我们上节内容在没有使用数据库表时,使用的是select 字符 regexp '正则表达式' 这个语法,那么想把这个用法应用到数据库表的查询中,该如何使用呢?

select * from 表名 where 条件

我们直接把where中的条件替换为字符 regexp 正则表达式即可而where条件会返回为True的记录(0等价于False,1等价于True),到这里用法基本了解了,下面来看一个示例。

示例:匹配用户名包含汉字的记录

select * from user where name regexp '[\u4e00-\u9fa5]';

匹配的结果中有全部为英文的,看起来5.7版本对这种用法并不友好。

不过,仔细观察的话会发现一个很有意思的事:ID为1,7,8这些记录没有被匹配到,而这3个里都没有字母和数字,这似乎从另一个角度说明如果保证数据只有汉字、数字以及字母的条件下,可以使用以下用法匹配全为汉字的部分。

name not regexp '[\u4e00-\u9fa5]'

如果上面没有日文,这里则只返回清风,李清1和李清2这种不全为汉字的没有被返回。(另外需要注意的是,如果在汉字中夹杂着符号,使用该用法时同样会被返回)

那么,到底怎么直接匹配到汉字呢?这里就需要借助UTF8汉字编码对照表,既然你5.7版本对unicode形式不友好,那我试试其中的16进制形式。

这里需要借助16进制转换函数HEX()把字符转换成16进制。

select * from user where hex(name) regexp 'e[4-9][0-9a-f]{4}';

返回的结果正是我们想要的。

    8.0版本

同样的,我们先来看建表时默认的字符编码

select * from user where name regexp '[\u4e00-\u9fa5]';

结果和5.7版本的一致,但结合之前小节的内容,这里做一个尝试:替换\u为\\u

select * from user where name regexp '[\\u4e00-\\u9fa5]';

没想到这样居然可以,接下来再测试下16进制能不能用

select * from user where hex(name) regexp 'e[4-9][0-9a-f]{4}';

完美匹配。

2. 限定组(*、+、?、{n,})

示例:匹配name包含ll的记录

select * from user where name regexp 'l{2}';

这里5.7版本和8.0版本用法一致。

3. 位置组(^、$)

示例:返回姓李的用户的记录

select * from user where name regexp '^李';

这里5.7版本和8.0版本用法一致。

4. 位置组(\b)

    5.7版本

通过之前的内容,相信不少客官姥爷都能猜到这里不会匹配到任何记录。

select * from user where name regexp '\bJohn\b';

对于单词的开始或者结尾,5.7版本有自己独特的用法。

[[:<:]]表示单词的开始,[[:>:]]表示单词的结尾
select * from user where name regexp '[[:<:]]John[[:>:]]';

    8.0版本

对于8.0版本,则直接加斜杠即可。

select * from user where name regexp '\\bJohn\\b';

以上就是本次的分享,正则表达式之数据库系列正在进行中,欢迎各位客官姥爷关注我,方便您第一次时间收到【干货】!

(0)

相关推荐

  • 正则表达式A - 方法及特殊字符用法

      课程大纲  1.正则表达式的概念及作用 2.正则表达式的创建方法 3.正则表达式的用法 正则表达式概念: 正则表达式是由普通字符及特殊字符组成的对字符串进行过滤的逻辑公式 正则表达式的创建方式: ...

  • SQL中的正则表达式

    正则表达式通常用来匹配字符,比如在一段字符中截取我们想要的字符,又或者将不想要的字符串替换,或者统计某个或者某几个字符出现的次数,我们都可以使用Oracle提供的正则表达式语法来完成. 1.比如,我们 ...

  • 正则表达式在MySQL5.7和MySQL8.0中的用法以及区别(一)

    各位客官姥爷好,欢迎回来.我们上节给出了MySQL数据库的安装教程,我们上节给的是5.7版本的安装教程,鉴于有部分企业已经使用8.0版本的MySQL,那么下面我将对比着学习正则表达式在这两个版本中的差 ...

  • 正则表达式在MySQL5.7和MySQL8.0中的用法以及区别(二)

    各位客官姥爷好,欢迎回来.我们上节给出了正则表达式在MySQL5.7与MySQL8.0中用法的区别,下面我们将继续正则表达式在Mysql数据库中使用系列内容. 元字符 1. \s:任意空白符      ...

  • 正则表达式在MySQL5.7和MySQL8.0中的用法以及区别(应用篇)

    各位客官姥爷好,欢迎回来.相信大家通过前面的内容对正则在mysql中的用法有一定的认识,那本节我们通过几个应用示例来回忆下这些用法. 这里依旧使用上节创建的测试表user,上节内容传送门:MySQL正 ...

  • 如何在Vray4.0中简洁高效的渲染AO图?

    hello小伙伴们~又到了每周一的制图教室时间啦,今天为大家带来的是一篇关于最新版Vray next for Sketchup中AO图渲染的教程讲解. 2019年2月, Chaos group 发布了 ...

  • 5连败!10投0中杀死球队!命中率没威少高!大表哥这是怎么了?

    北京时间4月26日,开拓者主场迎战灰熊.最终开拓者以113-120不敌对手,吞下5连败!除了第四节开拓者单节比分高于灰熊,其余前面三节都是落后的一方. 第三节结束,开拓者落后着12分.第四节球队一度发 ...

  • NetCore 3.0 中使用Swagger生成Api说明文档及升级报错原因

    认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...

  • MySQL8.0新特性

    MySQL从5.7一跃直接到8.0,这其中的缘由,咱就不关心那么多了,有兴趣的朋友自行百度,本次的版本更新,在功能上主要有以下6点: 账户与安全 优化器索引 通用表表达式 窗口函数 InnoDB 增强 ...

  • 上场27分钟5投0中,落后33分还捻须微笑,赛后詹姆斯说了这句话

    北京时间1月12日,骑士客场对阵猛龙!阵容相对齐整的骑士,面对缺兵少将的猛龙,却毫无招架之力,最终以99-133的巨大分差输掉比赛,实在是让人大跌眼镜,就连猛龙球员迈尔斯赛后也表示:我们以为会是一场苦 ...

  • 9投0中!0分4板1助!只想要年薪3000万大合同!湖人队史最差……

    在湖人和太阳的天王山之战中,有一个球员的数据堪称辣眼睛:施罗德出战26分钟,投篮9中0,三分4中0,得到0分4篮板1助攻.他是湖人队史首位在季后赛至少出手9次,却没有得分的球员.一战写进球队历史,施罗 ...