MySQL REGEXP Vysvětleno: Kompletní průvodce s příklady (včetně funkcí MySQL 8.0)

目次

1. Úvod

Co je regulární výraz MySQL (REGEXP)?

Regulární výrazy v MySQL jsou výkonné nástroje pro flexibilní vyhledávání a manipulaci s řetězci v databázi. Umožňují pokročilé porovnávání vzorů, které je obtížné dosáhnout pomocí standardního vyhledávání řetězců, a umožňují extrahovat data, která odpovídají konkrétním formátům nebo podmínkám.

Například můžete snadno extrahovat data jako „jména začínající konkrétním znakem“ nebo „kódy obsahující pouze číselné hodnoty“. Tato funkčnost je zvláště užitečná při čištění dat a zpracování složitých podmínek vyhledávání.

Výhody používání regulárních výrazů v MySQL

  1. Podpora složitých podmínek vyhledávání
  • Můžete specifikovat složité řetězcové vzory, které nelze zpracovat standardním operátorem LIKE.
  1. Dávkové extrahování a nahrazování dat
  • Například můžete extrahovat pouze data, která odpovídají konkrétnímu formátu, nebo nahradit část řetězce.
  1. Rozšířené funkce v MySQL 8.0 a novějších
  • Byly přidány nové funkce, jako jsou REGEXP_LIKE a REGEXP_SUBSTR, které umožňují flexibilnější operace.

Účel tohoto článku

Tento článek vysvětluje vše od základního použití regulárních výrazů MySQL (REGEXP) po pokročilé příklady a důležité úvahy. Ať už jste začátečník nebo poloprofesionál, najdete zde praktické poznatky užitečné pro reálné aplikace.

V následující sekci vysvětlíme základy regulárních výrazů v MySQL.

2. Základy regulárních výrazů v MySQL

Co je operátor REGEXP?

V MySQL se operátor REGEXP používá k práci s regulárními výrazy. Tento operátor určuje, zda hodnota odpovídá zadanému vzoru. Navíc RLIKE funguje jako alias pro REGEXP.

Následující příklad kontroluje, zda řetězec odpovídá vzoru „abc”.

SELECT * FROM users WHERE name REGEXP 'abc';

Základní syntaxe operátoru REGEXP

Základní syntaxe pro vyhledávání pomocí regulárních výrazů je následující:

SELECT * FROM table_name WHERE column_name REGEXP 'pattern';

Seznam běžných vzorů REGEXP

SymbolDescriptionExample
^Matches the beginning of a line^abc → Strings that start with „abc“
$Matches the end of a lineabc$ → Strings that end with „abc“
.Matches any single charactera.c → Matches „abc“, „adc“, etc.
|OR (matches either pattern)abc|xyz → Matches „abc“ or „xyz“
[]Matches any one of the specified characters[abc] → Matches „a“, „b“, or „c“
*Matches zero or more repetitionsab*c → Matches „ac“, „abc“, „abbc“, etc.

Rozdíl mezi REGEXP a LIKE

FeatureLIKEREGEXP
FlexibilitySupports only wildcards (% and _)Supports advanced pattern matching
PerformanceFastMay be slightly slower for complex patterns

Praktické příklady: Vyhledávání pomocí REGEXP

Příklad 1: Vyhledání platného formátu e‑mailu

SELECT * FROM users WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';

Příklad 2: Vyhledání polí obsahujících pouze čísla

SELECT * FROM orders WHERE order_id REGEXP '^[0-9]+$';

Shrnutí

V této sekci jsme pokryli základní použití a vzory operátoru REGEXP v MySQL. To umožňuje vše od jednoduchých vyhledávání po pokročilé porovnávání vzorů pro flexibilní operace s daty.

3. Funkce regulárních výrazů přidané v MySQL 8.0

REGEXP_LIKE() – Kontrola shody pomocí regulárního výrazu

REGEXP_LIKE(string, pattern [, flags])

Příklad:

SELECT REGEXP_LIKE('abcdef', 'abc');

Výsledek: 1 (shoduje)

REGEXP_INSTR() – Najděte pozici shody

REGEXP_INSTR(string, pattern [, start_position, occurrence, flags, return_type])

Příklad:

SELECT REGEXP_INSTR('abcdef', 'cd');

Výsledek: 3

REGEXP_SUBSTR() – Extrahujte odpovídající podřetězec

REGEXP_SUBSTR(string, pattern [, start_position, occurrence, flags])

Příklad:

SELECT REGEXP_SUBSTR('abc123def', '[0-9]+');

Výsledek: 123

REGEXP_REPLACE() – Nahraďte pomocí regulárního výrazu

REGEXP_REPLACE(string, pattern, replacement [, start_position, occurrence, flags])

Příklad:

SELECT REGEXP_REPLACE('Item123Price456', '[0-9]', '#');

Výsledek: Item###Price###

Shrnutí

Funkce regulárních výrazů přidané v MySQL 8.0 umožňují podrobné a flexibilní operace s řetězci. Jejich efektivním použitím můžete data extrahovat a transformovat efektivněji.

4. Praktické případy použití regulárních výrazů

Vyhledávání dat odpovídajících konkrétním vzorům

Příklad 1: Detekce formátu e‑mailové adresy

SELECT * FROM users WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';

Příklad 2: Detekce formátu telefonního čísla

SELECT * FROM contacts WHERE phone REGEXP '^[0-9]{3}-[0-9]{4}-[0-9]{4}$';

Extrahování podřetězců

Příklad 1: Extrahování číselné části

SELECT REGEXP_SUBSTR('abc123def456', '[0-9]+');

Výsledek: 123

Nahrazení dat

Příklad 1: Nahrazení čísel znakem “#”

SELECT REGEXP_REPLACE('Item123Price456', '[0-9]', '#');

Výsledek: Item###Price###

Validace a čištění dat

Příklad 1: Detekce neplatných e‑mailových adres

SELECT * FROM users WHERE email NOT REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';

Shrnutí

S těmito příklady můžete efektivně řešit úkoly, jako je vyhledávání, extrahování, nahrazování a validace dat.

5. Důležité úvahy a osvědčené postupy

Práce s vícebajtovými znaky (znaky s plnou šířkou)

Protože regulární výrazy v MySQL jsou ve výchozím nastavení vyhodnocovány po bajtech, je nutná zvláštní opatrnost při práci s vícebajtovými znaky, jako jsou japonské znaky.

Řešení:

ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Dopad na výkon

Problém: Protože regulární výrazy zahrnují složité zpracování, může výkon klesat při vyhledávání ve velkých datových sadách.
Řešení:

SELECT * FROM users WHERE email LIKE '%@example.com' AND email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';

Ochrana proti ReDoS (Denial of Service pomocí regulárních výrazů)

Problém: Škodlivé vzory mohou způsobit nadměrné zatížení systému.
Řešení:

  1. Používejte jednoduché vzory, kdykoli je to možné.
  2. Posilte validaci vstupů.
  3. Sledujte dobu provádění dotazů.

Kontrola kompatibility verzí

Novější funkce regulárních výrazů nejsou k dispozici v MySQL verzích starších než 8.0. Vždy před implementací ověřte verzi svého prostředí.

Testování v testovacím prostředí

Předem otestujte chování a výkon dotazů, včetně toho, jak jsou zpracovány okrajové případy a neplatné hodnoty.

Shrnutí

Mějte na paměti tyto osvědčené postupy, abyste regulární výrazy používali bezpečně a efektivně, s ohledem na výkon i bezpečnost.

6. Závěr

Hlavní poznatky

  1. Naučením základních operací a vzorů regulárních výrazů můžete řešit vše od jednoduchých vyhledávání po složité extrahování dat.
  2. Funkce regulárních výrazů zavedené v MySQL 8.0 umožňují ještě flexibilnější operace.
  3. Používání praktických příkladů zvyšuje efektivitu při manipulaci s reálnými daty.
  4. Aplikace osvědčených postupů zajišťuje bezpečné a výkonné dotazy.

Výhody používání regulárních výrazů v MySQL

  • Pokročilé vyhledávací možnosti: Snadno definujte podmínky, které jsou obtížné při jednoduchém vyhledávání řetězců.
  • Zvýšená efektivita zpracování dat: Extrahování, nahrazování a validace mohou být provedeny přímo v SQL.
  • Široké spektrum aplikací: Užitečné pro vše od čištění dat po analýzu logů.

Jak pokračovat v učení a aplikaci

  1. Procvičujte dotazy s reálnými datovými sadami, abyste prohloubili své porozumění.
  2. Aktivně využívejte funkce nejnovější verze k optimalizaci výkonu.
  3. Pravidelně kontrolujte své dotazy, aby byly bezpečné a rychlé.

Závěrečné úvahy

Ovládnutím regulárních výrazů v MySQL můžete zlepšit provozní efektivitu a rozšířit své schopnosti v analýze dat.

7. Často kladené otázky (FAQ)

Q1. Jaký je rozdíl mezi REGEXP a LIKE v MySQL?

A. REGEXP podporuje pokročilé porovnávání vzorů, zatímco LIKE se používá hlavně pro částečné porovnávání řetězců.

SELECT * FROM users WHERE email LIKE '%example.com';
SELECT * FROM users WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';

Q2. Jak mohu zlepšit výkon?

A.

  1. Aplikujte podmínky filtru předem.
  2. Efektivně využívejte indexy.
  3. Udržujte dotazy jednoduché a optimalizované.

Q3. Jak zacházet s vícebytovými znaky?

A. Nakonfigurujte podporu UTF-8.

ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Q4. Můžete ukázat příklad nahrazení pomocí regulárních výrazů?

A. Nahraďte čísla znakem “#”.

SELECT REGEXP_REPLACE('Item123Price456', '[0-9]', '#');

Q5. Jaký je dotaz pro převod formátu data?

A. Změňte “YYYY/MM/DD” na “YYYY-MM-DD”.

SELECT REGEXP_REPLACE('2023/12/20', '/', '-');

Q6. Jak mohu specifikovat více podmínek pomocí REGEXP?

A. Použijte znak svislé čáry (|).

SELECT * FROM products WHERE name REGEXP 'phone|tablet';

Shrnutí

Sekce FAQ se zabývala běžnými otázkami a poskytla praktické příklady dotazů.