Nå, det er kun dobbelt-escape, men ja det virker, og her er grunden:i MySQL er der et andet lag af escape involveret, når du bruger LIKE
operatør.
services LIKE '%L\\\\u00e4mm\\\\u00f6n%'
parsing af denne MySQL streng literal giver dig en sammenligning med LIKE-forespørgslen %L\\u00e4mm\\u00f6n%
. Fordi MySQL behandler \
i en LIKE-forespørgsel som en escape, der faktisk vil matche den bogstavelige streng, der indeholder L\u00e4mm\u00f6n
.
Grunden til dette er, at du kan matche strenge mod et forespørgselsudtryk, der indeholder en bogstavelig %
eller _
Karakter. For eksempel hvis jeg vil søge i en kolonne efter den bogstavelige streng 100%
, jeg kan matche det med 100\%
(skrevet i en forespørgsel som '100\\%'
) og sørg for, at jeg virkelig får hundrede procent og bare ikke en streng, der starter med hundrede.
Det er uheldigt, at MySQL bruger omvendt skråstreg til både sin LIKE-forespørgsels-escape og sin streng-literal-escape, især i betragtning af, at du sandsynligvis skriver i et omsluttende programmeringssprog, der også bruger dem, og ender med en faktisk tripel-encoding, som ligner "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'"
- Argh!
Det er dobbelt så uheldigt, da denne adfærd ikke er ANSI SQL-konform og ikke vil fungere i nogen anden database. ANSI SQL siger, at der ikke er noget escape-tegn i LIKE-forespørgsler som standard, så hvis du vil matche en bogstavelig %
eller _
du skal tilmelde dig ved at nominere en egen flugtkarakter, f.eks.:
something LIKE '100=%' ESCAPE '='
For krydsdatabasekompatibilitet er det bedst altid at bruge LIKE
...ESCAPE
form, og vælg noget andet end den forfærdelige skråstreg! (Bortset - MySQL's omvendte skråstreg til SQL-strengs literal escape er heller ikke ANSI-konforme! Men du kan slå den forkerte opførsel fra med NO_BACKSLASH_ESCAPES sql_mode-indstillingen.)
En bedre idé ville nok være at bryde services
ud i en anden tabel i stedet for at klemme dem ind i en enkelt strengsøjle - dvs. sæt dit skema i First Normal Form. Så kunne du få et simpelt opslag af individuelle værdier i stedet for at skulle lave en langsom fuld-tabel-scanning understreng-match.