MySQL 提供標準的 SQL 模式比對,以及一種基於擴充正規表示式的模式比對形式,類似於 Unix 公用程式(例如 vi、grep 和 sed)所使用的模式比對。
SQL 模式比對可讓您使用 _
來比對任何單一字元,並使用 %
來比對任意數量的字元(包括零個字元)。在 MySQL 中,SQL 模式預設是不區分大小寫的。以下是一些範例。當您使用 SQL 模式時,請勿使用 =
或 <>
。請改用 LIKE
或 NOT 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()
函數(或 REGEXP
或 RLIKE
運算子,它們是 REGEXP_LIKE()
的同義詞)。
以下清單說明擴充正規表示式的一些特性
.
符合任何單一字元。字元類別
[...]
符合括號內的任何字元。例如,[abc]
符合a
、b
或c
。若要指定字元範圍,請使用連字號。[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 節,〈正規表示式〉。