3.3.4.7 模式匹配

MySQL 提供标准的 SQL 模式匹配以及一种基于扩展正则表达式的模式匹配形式,类似于 vigrepsed等 Unix 实用程序所使用的模式匹配。

SQL 模式匹配使您能够使用它_ 来匹配任何单个字符和%匹配任意数量的字符(包括零个字符)。在 MySQL 中,默认情况下 SQL 模式不区分大小写。此处显示了一些示例。当您使用 SQL 模式时不要使用 =或。<>请改用LIKENOT LIKE比较运算符。

要查找以 开头的名称b

Press CTRL+C to copy
mysql> 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 copy
mysql> 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 | +--------+--------+---------+------+------------+-------+

要查找包含 a 的名称w

Press CTRL+C to copy
mysql> 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 copy
mysql> 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()函数(或 REGEXPor RLIKE 运算符,它们是 的同义词 REGEXP_LIKE())。

以下列表描述了扩展正则表达式的一些特征:

  • .匹配任何单个字符。

  • 字符类[...]匹配方括号内的任何字符。例如, [abc]匹配abc。要命名一系列字符,请使用破折号。[a-z] 匹配任何字母,而[0-9] 匹配任何数字。

  • *匹配它前面的事物的零个或多个实例。例如,x* 匹配任意数量的x字符, [0-9]*匹配任意数量的数字,.*匹配任意数量的任何东西。

  • 如果模式匹配被测试值中的任何位置,则正则表达式模式匹配成功。(这与LIKE模式匹配不同,模式匹配只有在模式匹配整个值时才会成功。)

  • 要锚定一个模式,使其必须匹配被测试值^的开头或$结尾,请在模式的开头或结尾使用。

为了演示扩展正则表达式的工作原理, LIKE前面显示的查询在此处重写为使用 REGEXP_LIKE().

要查找以 开头的名称b,请使用 ^匹配名称的开头:

Press CTRL+C to copy
mysql> 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 copy
SELECT * 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 copy
mysql> 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 | +--------+--------+---------+------+------------+-------+

要查找包含 a 的名称w,请使用以下查询:

Press CTRL+C to copy
mysql> 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 模式一样。

要查找恰好包含五个字符的名称,请使用 ^and$匹配名称的开头和结尾,以及 .中间的五个实例:

Press CTRL+C to copy
mysql> 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 | +-------+--------+---------+------+------------+-------+

您还可以使用( repeat- -times ) 运算符 编写先前的查询 :{n}n

Press CTRL+C to copy
mysql> 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 | +-------+--------+---------+------+------------+-------+

有关正则表达式语法的更多信息,请参阅第 12.8.2 节,“正则表达式”