Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

5.3.4.7 模式匹配

MySQL 提供标准 SQL 模式匹配,以及类似 Unix 实用程序(如 vigrepsed)使用的扩展正则表达式。

SQL 模式匹配使您可以使用 _ 匹配任何单个字符,并使用 % 匹配任意数量的字符(包括零个字符)。在 MySQL 中,SQL 模式默认情况下是不区分大小写的。一些示例如下所示。不要使用 =<> 当您使用 SQL 模式时。使用 LIKENOT LIKE 比较运算符代替。

要查找以 b 开头的名称:

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 结尾的名称:

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  |
+--------+--------+---------+------+------------+-------+

要查找包含 w 的名称:

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       |
+----------+-------+---------+------+------------+------------+

要查找恰好包含五个字符的名称,使用五个 _ 模式字符:

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() 函数(或 REGEXPRLIKE 运算符,它们是 REGEXP_LIKE() 的同义词)。

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

  • . 匹配任何单个字符。

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

  • * 匹配零个或多个前一个项目的实例。例如,x* 匹配任何数量的 x 字符,[0-9]* 匹配任何数量的数字,而 .* 匹配任何数量的任何内容。

  • 正则表达式模式匹配成功,如果模式匹配值中的任何位置都匹配。(这与 LIKE 模式匹配不同,后者仅在模式匹配整个值时成功。)

  • 要将模式锚定到值的开始或结束,请在模式的开始或结束处使用 ^$

为了演示扩展正则表达式的工作方式,之前的 LIKE 查询被重写为使用 REGEXP_LIKE()

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

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 匹配控制字符。每个查询仅匹配名称开头的 lowercase b

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 结尾的名称,使用 $ 匹配名称的结尾:

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  |
+--------+--------+---------+------+------------+-------+

要查找包含 w 的名称,使用这个查询:

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 模式时那样。

要查找恰好包含五个字符的名称,使用 ^$ 匹配名称的开始和结尾,并在中间使用五个 .

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  |
+-------+--------+---------+------+------------+-------+

您也可以使用 {n} (repeat-n-times) 运算符编写前一个查询:

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  |
+-------+--------+---------+------+------------+-------+

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