sql >> Databasteknik >  >> RDS >> Mysql

MySQL:Fråga efter unicode-enheter

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.



  1. mysql order by rand() prestandaproblem och lösning

  2. Mysql välj sista raden för varje grupp

  3. Python - mysqlDB, SQLite-resultat som ordbok

  4. Hur kan jag skicka en rad PDO-parametrar men ändå ange deras typer?