Tja, det är bara dubbel-escape, men ja det fungerar och här är anledningen:i MySQL är det ett andra lager av escape involverat när du använder LIKE
operatör.
services LIKE '%L\\\\u00e4mm\\\\u00f6n%'
Att analysera den bokstavliga MySQL-strängen ger dig en jämförelse med LIKE-frågan %L\\u00e4mm\\u00f6n%
. Eftersom MySQL behandlar \
i en LIKE-fråga som en escape, som faktiskt matchar den bokstavliga strängen som innehåller L\u00e4mm\u00f6n
.
Anledningen till detta är så att du kan matcha strängar mot ett frågeuttryck som innehåller en bokstavlig %
eller _
karaktär. Till exempel om jag vill söka i en kolumn efter den bokstavliga strängen 100%
, jag kan matcha det mot 100\%
(skriven i en fråga som '100\\%'
) och se till att jag verkligen får hundra procent och bara inte någon sträng som börjar med hundra.
Det är olyckligt att MySQL använder snedstreck för både sin LIKE-fråga-escapening och dess sträng-literal-escape, särskilt med tanke på att du förmodligen skriver i ett omslutande programmeringsspråk som också använder dem, och slutar med faktisk trippelkodning, som ser ut som "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'"
- argh!
Det är dubbelt olyckligt med tanke på att detta beteende inte överensstämmer med ANSI SQL och inte fungerar i någon annan databas. ANSI SQL säger att det inte finns något escape-tecken i LIKE-frågor som standard, så om du vill matcha en bokstavlig %
eller _
du måste välja in genom att nominera en egen flyktkaraktär, t.ex.:
something LIKE '100=%' ESCAPE '='
För korsdatabaskompatibilitet är det bäst att alltid använda LIKE
...ESCAPE
form, och välj något annat än det hemska snedstrecket! (Asides - MySQL:s omvända snedstreck för bokstavlig escape av SQL-strängar är inte heller ANSI-konforma! Men du kan stänga av det felaktiga beteendet med NO_BACKSLASH_ESCAPES sql_mode-inställningen.)
En bättre idé skulle förmodligen vara att bryta services
ut i en andra tabell istället för att klämma ihop dem i en enda strängkolumn - dvs. lägg ditt schema i First Normal Form. Då kan du få en enkel sökning av individuella värden istället för att behöva göra en långsam full-tabell-skanning understräng-matchning.