sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan undslipper du streng, mens du matcher mønster i PostgreSQL

Tegnene _ og % skal citeres for at blive matchet bogstaveligt i en LIKE-sætning, der er ingen vej udenom. Valget handler om at gøre det på klientsiden eller serversiden (typisk ved at bruge SQL replace(), se nedenfor). Også for at få det 100 % rigtigt i det generelle tilfælde, er der et par ting at overveje.

Som standard er anførselstegn, der skal bruges før _ eller %, omvendt skråstreg (\), men det kan ændres med en ESCAPE-klausul umiddelbart efter LIKE-sætningen. Under alle omstændigheder skal citationstegnet gentages to gange i mønsteret for at blive matchet bogstaveligt som ét tegn.

Eksempel:... WHERE field like 'john^%node1^^[email protected]%' ESCAPE '^' ville matche john%node1^[email protected] efterfulgt af noget.

Der er et problem med standardvalget af omvendt skråstreg:det bruges allerede til andre formål, når standard_conforming_strings er FRA (PG 9.1 har det ON som standard, men tidligere versioner er stadig i udbredt brug, dette er et punkt at overveje).

Hvis citeringen for LIKE jokertegn udføres på klientsiden i et brugerinput-injektionsscenario, kommer det udover til den normale streng-citering, der allerede er nødvendig ved brugerinput.

Et blik på et go-pgsql-eksempel fortæller, at det bruger pladsholdere i $N-stil til variabler... Så her er et forsøg på at skrive det på en generisk måde:det fungerer med standard_conforming_strings både TIL eller FRA, bruger erstatning på serversiden af [%_], et alternativt citattegn, citering af citattegn, og undgår sql-injektion:

   db.Query("SELECT * from USERS where name like replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') ||'%' ESCAPE '^'",
     variable_user_input);


  1. Sådan sammenkædes streng- og NULL-værdier i SQL Server

  2. Postgres-forbindelsen er blevet lukket fejl i Spring Boot

  3. Ydelsesovervejelser for midlertidige data i Oracle

  4. Standard Dato/Time Format Strings Understøttet af FORMAT() i SQL Server