相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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 比對控制字元。這些查詢中的每一個都只會比對名稱開頭的小寫 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} (「重複 n 次」)運算子來撰寫先前的查詢

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 節「正規表示式」