sql >> Database teknologi >  >> RDS >> Mysql

MySQL:Forespørgsel efter unicode-enheder

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.



  1. Kald pusher, når mysql har ændret sig

  2. Sådan deaktiveres plugins fra WordPress-databasen

  3. 11 måder at hente en primær nøgle i SQL Server (T-SQL eksempler)

  4. Begrænsning for kun én post markeret som standard