Spec-Zone.ru › MySQL 8.4

5.3.4.7 Сопоставление шаблонов

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} («“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 «Регулярные выражения».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/pattern-matching.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API