Cóż, to tylko podwójna ucieczka, ale tak, to działa i oto dlaczego:w MySQL istnieje druga warstwa ucieczki, gdy używasz LIKE
operatora.
services LIKE '%L\\\\u00e4mm\\\\u00f6n%'
parsowanie tego literału napisowego MySQL daje porównanie z zapytaniem LIKE %L\\u00e4mm\\u00f6n%
. Ponieważ MySQL traktuje \
w zapytaniu LIKE jako escape, który w rzeczywistości będzie pasował do dosłownego ciągu zawierającego L\u00e4mm\u00f6n
.
Powodem tego jest to, że możesz dopasować ciągi do wyrażenia zapytania, które zawiera dosłowny %
lub _
postać. Na przykład, jeśli chcę wyszukać w kolumnie ciąg dosłowny 100%
, mogę dopasować to do 100\%
(zapisany w zapytaniu jako '100\\%'
) i upewnij się, że naprawdę otrzymuję sto procent i po prostu nie mam żadnego ciągu zaczynającego się od stu.
To niefortunne, że MySQL używa odwrotnego ukośnika zarówno do ucieczki dla zapytania LIKE, jak i dla ucieczki literału ciągu, zwłaszcza biorąc pod uwagę, że prawdopodobnie piszesz w otaczającym języku programowania, który również ich używa, co kończy się rzeczywistym potrójnym kodowaniem, które wygląda jak "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'"
- argh!
Jest to podwójnie niefortunne, biorąc pod uwagę, że to zachowanie nie jest zgodne z ANSI SQL i nie będzie działać w żadnej innej bazie danych. ANSI SQL mówi, że domyślnie w zapytaniach LIKE nie ma znaku ucieczki, więc jeśli chcesz dopasować dosłowny %
lub _
musisz wyrazić zgodę, wyznaczając własną postać ucieczki, np.:
something LIKE '100=%' ESCAPE '='
Aby zapewnić zgodność między bazami danych, najlepiej zawsze używać LIKE
...ESCAPE
formularz i wybierz coś innego niż okropny odwrotny ukośnik! (Na marginesie - odwrotne ukośniki MySQL dla literowych znaków ucieczki SQL również nie są zgodne z ANSI! Ale możesz wyłączyć to niewłaściwe zachowanie za pomocą ustawienia NO_BACKSLASH_ESCAPES sql_mode.)
Prawdopodobnie lepszym pomysłem byłoby zerwanie services
do drugiej tabeli, zamiast zgniatać je w kolumnie z pojedynczym ciągiem - tj. umieść swój schemat w pierwszej formie normalnej. Wtedy możesz uzyskać proste wyszukiwanie poszczególnych wartości, zamiast wykonywać powolne skanowanie podciągów w pełnej tabeli.