LIKE, symbole wieloznaczne i znaki ucieczki
Dopasowywanie wzorców, znaczenie procentu i podkreślenia oraz zabezpieczanie dosłownych symboli wieloznacznych
LIKE, symbole wieloznaczne i znaki ucieczki to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Dopasowywanie wzorców pod lupą rekrutera
LIKE wygląda prosto, ale kryje trzy klasyczne pułapki rekrutacyjne: pomylenie % z _, zapomnienie, że występujący w danych dosłowny znak procentu lub podkreślenia wymaga zmiany znaczenia, oraz niespodziankę związaną z wrażliwością na wielkość liter, która różni się w zależności od bazy danych.
W tej lekcji szczegółowo omówiono oba znaki wieloznaczne, klauzulę ESCAPE oraz zasady różniące poszczególne dialekty, które rekruter wykorzysta, aby odróżnić osoby początkujące od tych, które wdrażały rzeczywiste funkcje wyszukiwania.
Dwa znaki wieloznaczne
LIKE ma dokładnie dwa znaki wieloznaczne:
%dopasowuje zero lub więcej znaków_dopasowuje dokładnie jeden znak
Dlatego 'a%' dopasowuje wszystko, co zaczyna się od a, natomiast 'a_' dopasowuje dwuznakowy ciąg zaczynający się od a. Pomylenie tych znaków to najczęstszy błąd związany z LIKE.
SELECT *
FROM customers
WHERE name LIKE 'A%';
-- every name beginning with AZnak procentu w dowolnym miejscu
Umiejscowienie znaku % określa, gdzie zakotwiczone jest dopasowanie:
'%son'kończy się na son (Johnson, Mason)'%mary%'zawiera mary w dowolnym miejscu'J%n'zaczyna się od J i kończy na n
Samotny znak '%' dopasowuje każdy wiersz, który nie ma wartości NULL. Wartości NULL nigdy nie pasują do żadnego wzorca LIKE, w tym do '%'.
SELECT *
FROM customers
WHERE email LIKE '%@gmail.com';Podkreślenie dla stałej długości
Symbol _ dopasowuje pojedynczy, dowolny znak, dlatego przydaje się w przypadku kodów o stałej długości. 'A__' dopasowuje dokładnie trzy znaki zaczynające się od A — ani mniej, ani więcej.
Rekruterzy sprawdzają to na przykładzie kodów produktów lub kodów krajów. Kandydat, który na prośbę o trzyznakowy kod zaczynający się od A napisze 'A%', popełnia subtelny błąd, zwracając ciągi zaczynające się od A o dowolnej długości.
SELECT *
FROM products
WHERE sku LIKE 'A__';
-- A followed by exactly two more charactersGdy % i _ występują w danych
Co zrobić, jeśli trzeba znaleźć wartości zawierające dosłowny znak procentu, na przykład etykietę rabatową „50% off”? Zapis LIKE '%50%%' nie zadziała, ponieważ końcowy znak % zostanie potraktowany jako symbol wieloznaczny, a nie znak dosłowny.
Należy poinformować SQL, że konkretny znak ma być traktowany dosłownie. Służy do tego klauzula ESCAPE.
Klauzula ESCAPE
Za pomocą ESCAPE należy zadeklarować znak zmiany znaczenia, a następnie poprzedzać nim każdy znak wieloznaczny, który ma być traktowany dosłownie. Tutaj ! jest znakiem zmiany znaczenia, więc !% oznacza dosłowny znak procentu.
Ten zapis wyszukuje wartości zawierające dosłowny tekst 50% w dowolnym miejscu. Znak zmiany znaczenia może być dowolny; należy wybrać taki, który nie występuje w wyszukiwanym tekście.
SELECT *
FROM promos
WHERE label LIKE '%50!%%' ESCAPE '!';
-- matches a literal '50%' anywhere in labelEscapowanie dosłownego podkreślenia
Podkreślenia często występują w nazwach użytkowników i identyfikatorach, a niepoprzedzony znakiem zmiany znaczenia symbol _ po cichu dopasowuje dowolny znak. Aby znaleźć adresy e-mail zaczynające się dosłownie od „a_b”, należy zmienić znaczenie podkreślenia.
Bez tego znaku 'a_b%' pasowałoby również do „axb”, „a9b” i podobnych wartości. Ten błąd nieustannie trafia do środowiska produkcyjnego, ponieważ zapytanie bez zmiany znaczenia nadal zwraca wiersze wyglądające wiarygodnie.
SELECT *
FROM users
WHERE handle LIKE 'a!_b%' ESCAPE '!';
-- handle starting with the literal text a_bWrażliwość na wielkość liter zależy od bazy danych
To, czy LIKE rozróżnia wielkość liter, zależy od silnika i sortowania:
- PostgreSQL:
LIKErozróżnia wielkość liter; do wyszukiwania bez rozróżniania wielkości liter służyILIKE - MySQL: zależy od sortowania kolumny, które często domyślnie nie rozróżnia wielkości liter
- SQL Server: zależy od ustawienia sortowania
Przenośnym i jednoznacznym rozwiązaniem jest zamiana obu stron na małe litery.
SELECT *
FROM customers
WHERE LOWER(name) LIKE 'a%';Ukryty koszt wydajnościowy
Wiodący symbol wieloznaczny, taki jak '%son', nie może użyć zwykłego indeksu B-tree, ponieważ indeks jest uporządkowany według prefiksu, a początek wyszukiwania nie został zakotwiczony. Silnik musi przeskanować każdy wiersz.
'son%' — końcowy symbol wieloznaczny przy zakotwiczonym prefiksie — może użyć indeksu. Rekruterzy uwielbiają pytać, dlaczego wyszukiwanie za pomocą LIKE działa wolno; zwykle odpowiedzią jest wiodący znak %.
-- index-friendly (anchored prefix):
WHERE name LIKE 'Smi%'
-- forces a scan (leading wildcard):
WHERE name LIKE '%mith'Alternatywy dla LIKE
Gdy LIKE nie wystarcza, warto wspomnieć o alternatywach, aby pokazać szerszą wiedzę:
SIMILAR TOi wyrażenia regularne POSIX (~,~*) w PostgreSQL — do obsługi prawdziwych wyrażeń regularnych- indeksy wyszukiwania pełnotekstowego dla dużych korpusów tekstu swobodnego
- indeksy trygramów (pg_trgm), które przyspieszają wyszukiwanie z wiodącym symbolem wieloznacznym
Wymienienie tych rozwiązań pokazuje, że wiadomo, iż LIKE wyznacza poziom podstawowy, a nie granicę możliwości wyszukiwania tekstowego.
Bezpieczne tworzenie wzorców LIKE na podstawie danych użytkownika
Rekruterzy często pytają: jak wyszukiwać wpisany przez użytkownika termin za pomocą LIKE, nie powodując problemów? Należy wskazać dwa zagrożenia:
- Wstrzyknięcie SQL — wartość należy przekazywać jako parametr; nigdy nie należy konkatenować surowych danych wejściowych z ciągiem SQL.
- Nieescapowane symbole wieloznaczne — jeśli dane wejściowe zawierają
%lub_, należy je poprzedzić znakiem ucieczki, aby były dopasowywane dosłownie.
Najpierw należy przekazać wartość jako parametr, a następnie dodać własne symbole wieloznaczne w zapytaniu.
-- $1 is bound as a parameter; wildcards are added in SQL
SELECT *
FROM products
WHERE name LIKE '%' || replace(replace($1, '_', '\_'), '%', '\%') || '%' ESCAPE '\';Szybki test
Proszę przypomnieć sobie różnicę między dwoma znakami wieloznacznymi.
Podsumowanie
Najważniejsze wnioski:
%dopasowuje zero lub więcej znaków;_dopasowuje dokładnie jeden- Aby dopasować występujący w danych dosłowny znak
%lub_, należy zadeklarować znak zmiany znaczenia za pomocąESCAPEi poprzedzić nim symbol wieloznaczny - Wrażliwość na wielkość liter zależy od silnika; zastosowanie
LOWER()po obu stronach jest przenośnym rozwiązaniem (Postgres maILIKE) - Wiodący symbol wieloznaczny wymusza pełne skanowanie, natomiast zakotwiczony prefiks może korzystać z indeksu
Podkreślenie bez zmiany znaczenia to cichy błąd: nadal zwraca wiarygodnie wyglądające wiersze.
Często zadawane pytania
Czy lekcja „LIKE, symbole wieloznaczne i znaki ucieczki” jest bezpłatna?
Tak — pełny tekst „LIKE, symbole wieloznaczne i znaki ucieczki” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „LIKE, symbole wieloznaczne i znaki ucieczki”?
Dopasowywanie wzorców, znaczenie procentu i podkreślenia oraz zabezpieczanie dosłownych symboli wieloznacznych Ćwiczysz Coding Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Coding Interview Prep?
Nie wymagamy żadnego doświadczenia. Coding Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „LIKE, symbole wieloznaczne i znaki ucieczki”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Coding Interview Prep?
Tak. Każda lekcja Coding Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Pierwszeństwo AND/OR i używanie nawiasów
- BETWEEN, IN i granice włączne
- LIKE, symbole wieloznaczne i znaki ucieczki
- Filtrowanie według wartości obliczanych