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

Vložit text s jednoduchými uvozovkami v PostgreSQL

Řetězcové literály

Jednoduché uvozovky ' jejich zdvojnásobením -> '' je standardní způsob a samozřejmě funguje:

'user's log'     -- incorrect syntax (unbalanced quote)
'user''s log'

Jednoduché uvozovky (ASCII / UTF-8 kód 39), pamatujte, ne zpětné zaškrtnutí ` , které nemají v Postgresu žádný zvláštní účel (na rozdíl od některých jiných RDBMS) a nemají dvojité uvozovky " , používané pro identifikátory.

Ve starých verzích nebo pokud stále používáte standard_conforming_strings = off nebo obecně, pokud před řetězec přidáte E deklarovat syntaxi escape řetězce Posix , můžete také uniknout pomocí zpětného lomítka \ :

E'user\'s log'

Samotné zpětné lomítko je ukončeno dalším zpětným lomítkem. Ale to obecně není vhodnější.
Pokud se musíte vypořádat s mnoha jednoduchými uvozovkami nebo několika vrstvami escapování, můžete se vyhnout citování v PostgreSQL pomocí řetězců s uvozovkami v dolarech :

'escape '' with '''''
$$escape ' with ''$$

Chcete-li se dále vyhnout záměně mezi dolarovými kotacemi, přidejte ke každému páru jedinečný token:

$token$escape ' with ''$token$

Které lze vnořit libovolný počet úrovní:

$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$

Věnujte pozornost $ znak by měl mít ve vašem klientském softwaru zvláštní význam. Možná budete muset uniknout navíc. To není případ standardních klientů PostgreSQL, jako je psql nebo pgAdmin.

To vše je velmi užitečné pro psaní funkcí plpgsql nebo ad-hoc SQL příkazů. Nemůže však zmírnit potřebu používat připravené příkazy nebo nějakou jinou metodu k ochraně proti vložení SQL do vaší aplikace, když je možný vstup uživatele. Odpověď @Craiga o tom má více. Další podrobnosti:

  • Injekce SQL ve funkcích Postgres vs připravené dotazy

Hodnoty uvnitř Postgres

Při práci s hodnotami v databázi existuje několik užitečných funkcí, jak správně citovat řetězce:

  • quote_literal() nebo quote_nullable() - druhý vypíše řetězec NULL pro nulový vstup. (Existuje také quote_ident() na dvojité uvozovky řetězce tam, kde je potřeba získat platné identifikátory SQL .)
  • format() se specifikátorem formátu %L je ekvivalentní quote_nullable() .
    Jako:format('%L', string_var)
  • concat() nebo concat_ws() obvykle nejsou pro tento účel dobré, protože není escape vnořených jednoduchých uvozovek a zpětných lomítek.


  1. SQL Server Sledování běžících dotazů

  2. MySQL v cloudu – výhody a nevýhody Amazon RDS

  3. Jak vytvořit databázi PostgreSQL

  4. PHP/MySQL Vložit hodnoty null