MySQL 提供标准 SQL 模式匹配以及基于扩展正则表达式的模式匹配形式,类似于 Unix 实用程序(如 vi、grep 和 sed)中使用的模式。
SQL 模式匹配允许您使用 _
匹配任何单个字符,使用 %
匹配任意数量的字符(包括零个字符)。在 MySQL 中,SQL 模式默认区分大小写。这里有一些示例。在使用 SQL 模式时,请勿使用 =
或 <>
。请改用 LIKE
或 NOT LIKE
比较运算符。
要查找以 b
开头的名称
Press CTRL+C to copymysql> SELECT * FROM pet WHERE name LIKE 'b%'; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+
要查找以 fy
结尾的名称
Press CTRL+C to copymysql> SELECT * FROM pet WHERE name LIKE '%fy'; +--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+
要查找包含 w
的名称
Press CTRL+C to copymysql> SELECT * FROM pet WHERE name LIKE '%w%'; +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | +----------+-------+---------+------+------------+------------+
要查找包含恰好五个字符的名称,请使用五个 _
模式字符
Press CTRL+C to copymysql> SELECT * FROM pet WHERE name LIKE '_____'; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
MySQL 提供的另一种模式匹配类型使用扩展正则表达式。当您测试此类型模式的匹配项时,请使用 REGEXP_LIKE()
函数(或 REGEXP
或 RLIKE
运算符,它们是 REGEXP_LIKE()
的同义词)。
以下列表描述了扩展正则表达式的一些特征
.
匹配任何单个字符。字符类
[...]
匹配方括号内的任何字符。例如,[abc]
匹配a
、b
或c
。要命名字符范围,请使用连字符。[a-z]
匹配任何字母,而[0-9]
匹配任何数字。*
匹配它前面的内容的零个或多个实例。例如,x*
匹配任意数量的x
字符,[0-9]*
匹配任意数量的数字,.*
匹配任意数量的任何内容。如果模式匹配测试值的任何位置,则正则表达式模式匹配成功。(这与
LIKE
模式匹配不同,后者仅在模式匹配整个值时才成功。)要锚定模式以使其必须匹配测试值的开头或结尾,请在模式的开头使用
^
或在模式的结尾使用$
。
为了演示扩展正则表达式的工作原理,前面显示的 LIKE
查询在此重新编写以使用 REGEXP_LIKE()
。
要查找以 b
开头的名称,请使用 ^
匹配名称的开头
Press CTRL+C to copymysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b'); +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+
要强制正则表达式比较区分大小写,请使用区分大小写的排序规则,或使用 BINARY
关键字将其中一个字符串转换为二进制字符串,或指定 c
匹配控制字符。这些查询中的每一个都只匹配名称开头的 小写 b
Press CTRL+C to copySELECT * FROM pet WHERE REGEXP_LIKE(name, '^b' COLLATE utf8mb4_0900_as_cs); SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY '^b'); SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b', 'c');
要查找以 fy
结尾的名称,请使用 $
匹配名称的结尾
Press CTRL+C to copymysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'fy$'); +--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+
要查找包含 w
的名称,请使用此查询
Press CTRL+C to copymysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'w'); +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | +----------+-------+---------+------+------------+------------+
因为正则表达式模式匹配在测试值的任何位置出现,所以在上一个查询中,没有必要在模式的两侧添加通配符以使其匹配整个值,如 SQL 模式中那样。
要查找包含恰好五个字符的名称,请使用 ^
和 $
匹配名称的开头和结尾,并在两者之间使用五个 .
Press CTRL+C to copymysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.....$'); +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
您也可以使用 {
(“重复-n
}n
-次”) 运算符编写上一个查询
Press CTRL+C to copymysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.{5}$'); +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
有关正则表达式语法的更多信息,请参见 第 14.8.2 节,“正则表达式”。