sql >> Databáze >  >> RDS >> PostgreSQL

Jak uniknout řetězci při porovnávání vzoru v PostgreSQL

Znaky _ a % musí být uvedeny v uvozovkách, aby se doslovně shodovaly v příkazu LIKE, nelze to nijak obejít. Volba spočívá v tom, že to uděláte na straně klienta nebo na straně serveru (obvykle pomocí SQL replace(), viz níže). Aby to bylo v obecném případě 100% správné, je třeba zvážit několik věcí.

Ve výchozím nastavení je znakem uvozovky, který se má použít před _ nebo % zpětné lomítko (\), ale lze jej změnit pomocí klauzule ESCAPE bezprostředně za klauzulí LIKE. V každém případě se znak uvozovky musí ve vzoru opakovat dvakrát, aby být spojeny doslova jako jeden znak.

Příklad:... WHERE field like 'john^%node1^^[email protected]%' ESCAPE '^' by odpovídalo john%node1^[email protected] následuje cokoli.

Vyskytl se problém s výchozí volbou zpětného lomítka:již se používá pro jiné účely, když je standard_conforming_strings VYPNUTO (PG 9.1 jej má ve výchozím nastavení zapnuto, ale předchozí verze jsou stále široce používány, což je bod ke zvážení).

Také pokud se citace zástupného znaku LIKE provádí na straně klienta ve scénáři vkládání uživatelského vstupu, přichází kromě na normální uvozování řetězců, které je již nutné na uživatelském vstupu.

Pohled na příklad go-pgsql prozradí, že pro proměnné používá zástupné symboly ve stylu $N... Zde je tedy pokus napsat to nějak obecně:funguje se zapnutými i vypnutými řetězci standard_conforming_strings, používá nahrazení na straně serveru [%_], alternativní znak uvozovky, citace znaku uvozovky a vyhýbá se vkládání sql:

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


  1. MySQL DATEDIFF() vs TIMESTAMPDIFF():Jaký je rozdíl?

  2. Co to znamená „normalizovat“ databázi?

  3. Jaká jsou omezení SQL a jejich různé typy?

  4. Jak mohu změnit výchozí časový limit připojení Mysql při připojování přes python?