Ř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()
neboquote_nullable()
- druhý vypíše řetězecNULL
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)
neboconcat()
obvykle nejsou pro tento účel dobré, protože není escape vnořených jednoduchých uvozovek a zpětných lomítek.concat_ws()