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

Undslippende MySQL-wild cards

_ og % er ikke jokertegn i MySQL generelt, og bør ikke escapes med det formål at sætte dem ind i normale strenge bogstaver. mysql_real_escape_string er korrekt og tilstrækkelig til dette formål. addcslashes bør ikke bruges.

_ og % er specielle udelukkende i forbindelse med LIKE -matchende. Når du vil forberede strenge til bogstavelig brug i en LIKE sætning, så 100% matcher et hundrede procent og ikke en hvilken som helst streng, der starter med hundrede, du har to niveauer af undslippe at bekymre dig om.

Den første er SOM at flygte. LIKE-håndtering foregår helt inde i SQL, og hvis du vil omdanne en bogstavelig streng til et bogstavelig LIKE-udtryk, skal du udføre dette trin selvom du bruger parametriserede forespørgsler !

I dette skema, _ og % er specielle og skal undslippes. Flugtkarakteren skal også undslippes. Ifølge ANSI SQL må andre tegn end disse ikke være escaped:\' ville være forkert. (Selvom MySQL typisk vil lade dig slippe af sted med det.)

Når du har gjort dette, fortsætter du til det andet niveau af escape, som er almindelig gammel streng bogstavelig escape. Dette foregår uden for SQL, hvilket skaber SQL, så det skal gøres efter LIKE-escape-trinnet. For MySQL er dette mysql_real_escape_string som før; for andre databaser vil der være en anden funktion, for du kan bare bruge parametriserede forespørgsler for at undgå at skulle gøre det.

Problemet, der fører til forvirring her, er, at der i MySQL bruges en omvendt skråstreg som et escape-tegn for begge de indlejrede escape-trin! Så hvis du ville matche en streng mod et bogstaveligt procenttegn, skulle du dobbelt-backslash-escape og sige LIKE 'something\\%' . Eller, hvis det er i en PHP " literal som også bruger backslash escaping, "LIKE 'something\\\\%'" . Argh!

Dette er forkert ifølge ANSI SQL, som siger, at:i bogstaver i streng betyder omvendte skråstreg bogstavelige skråstreg og måden at undslippe et enkelt anførselstegn er ''; i LIKE-udtryk er der ingen escape-tegn overhovedet som standard.

Så hvis du vil LIKE-escape på en bærbar måde, bør du tilsidesætte standard (forkert) adfærd og angive dit eget escape-tegn ved at bruge LIKE ... ESCAPE ... konstruere. For fornuftens skyld vælger vi noget andet end den forbandede skråstreg!

function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}

$escapedname= mysql_real_escape_string(like($name, '='));
$query= "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";

eller med parametre (f.eks. i PDO):

$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ...");
$q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);

(Hvis du vil have mere bærbar festtid, kan du også have det sjovt med at prøve at tage højde for MS SQL Server og Sybase, hvor [ karakter er også, forkert, speciel i en LIKE erklæring og skal undslippes. argh.)



  1. Sådan konfigureres PostgreSQL Sharding med ClusterControl

  2. SQL Server Error 206:Operand type sammenstød

  3. Hvordan opdaterer jeg, hvis den findes, indsæt hvis ikke (AKA upsert or merge) i MySQL?

  4. Hvordan synkroniseres SQLite-database på Android-telefon med MySQL-database på serveren?