Е, това е само двойно екраниране, но да, работи и ето защо:в MySQL има втори слой на екраниране, когато използвате LIKE
оператор.
services LIKE '%L\\\\u00e4mm\\\\u00f6n%'
анализирането на този литерал на MySQL низ ви дава сравнение с LIKE-заявката %L\\u00e4mm\\u00f6n%
. Тъй като MySQL третира \
в LIKE заявка като escape, това всъщност ще съвпада с литерален низ, съдържащ L\u00e4mm\u00f6n
.
Причината за това е, за да можете да съпоставите низове с израз на заявка, който съдържа литерал %
или _
характер. Например, ако искам да търся колона за литералния низ 100%
, мога да го съпоставя с 100\%
(написано в заявка като '100\\%'
) и се уверете, че наистина получавам сто процента, а не някакъв низ, започващ със сто.
Жалко е, че MySQL използва обратна наклонена черта както за екранирането на заявката LIKE, така и за избягването на литерала на низ, особено като се има предвид, че вероятно пишете на затворен език за програмиране, който също ги използва, завършвайки с действително тройно кодиране, което изглежда като "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'"
- ах!
Това е двойно жалко, като се има предвид, че това поведение не е съвместимо с ANSI SQL и няма да работи в никоя друга база данни. ANSI SQL казва, че в заявките LIKE по подразбиране няма escape-символ, така че ако искате да съпоставите литерал %
или _
трябва да се включите, като номинирате свой собствен символ за бягство, напр.:
something LIKE '100=%' ESCAPE '='
За съвместимост между бази данни е най-добре винаги да използвате LIKE
...ESCAPE
форма и изберете нещо различно от ужасната обратна наклонена черта! (Отстрани – обратните наклонени черти на MySQL за избягване на литерал на SQL низ също не са съвместими с ANSI! Но можете да изключите това лошо поведение с настройката NO_BACKSLASH_ESCAPES sql_mode.)
Вероятно по-добра идея би била да разбиете services
във втора таблица, вместо да ги смачквате в колона с един низ - т.е. поставете вашата схема в Първа нормална форма. Тогава бихте могли да получите просто търсене на индивидуални стойности, вместо да се налага да правите бавно съвпадение на поднизове при сканиране на цяла таблица.