Literały łańcuchowe
Unikanie pojedynczych cudzysłowów '
podwajając je -> ''
to standardowy sposób i oczywiście działa:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Zwykłe pojedyncze cudzysłowy (kod 39 ASCII / UTF-8), pamiętaj, nie cofać `
, które nie mają specjalnego przeznaczenia w Postgresie (w przeciwieństwie do niektórych innych RDBMS) i nie zawierają podwójnych cudzysłowów "
, używany do identyfikatorów.
W starych wersjach lub jeśli nadal używasz standard_conforming_strings = off
lub ogólnie, jeśli poprzedzisz swój ciąg E
aby zadeklarować składnię POSixowego łańcucha ucieczki , możesz również uciec za pomocą odwrotnego ukośnika \
:
E'user\'s log'
Sam odwrotny ukośnik jest poprzedzany innym odwrotnym ukośnikiem. Ale generalnie nie jest to zalecane.
Jeśli masz do czynienia z wieloma pojedynczymi cudzysłowami lub wieloma warstwami znaków ucieczki, możesz uniknąć cytowania piekła w PostgreSQL za pomocą ciągów w cudzysłowie :
'escape '' with '''''
$$escape ' with ''$$
Aby jeszcze bardziej uniknąć zamieszania między cytatami w dolarach, dodaj unikalny token do każdej pary:
$token$escape ' with ''$token$
Które mogą być zagnieżdżone na dowolnej liczbie poziomów:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Zwróć uwagę, czy $
znak powinien mieć specjalne znaczenie w oprogramowaniu klienckim. Być może będziesz musiał dodatkowo uciec. Nie dotyczy to standardowych klientów PostgreSQL, takich jak psql lub pgAdmin.
To wszystko jest bardzo przydatne do pisania funkcji plpgsql lub poleceń SQL ad-hoc. Nie może jednak złagodzić potrzeby korzystania z przygotowanych instrukcji lub innej metody zabezpieczenia przed wstrzyknięciem SQL w aplikacji, gdy możliwe jest wprowadzenie danych przez użytkownika. Odpowiedź @Craiga zawiera więcej informacji na ten temat. Więcej szczegółów:
- Wstrzyknięcie SQL w funkcje Postgresa a przygotowane zapytania
Wartości w Postgresie
Kiedy mamy do czynienia z wartościami w bazie danych, istnieje kilka przydatnych funkcji do prawidłowego cytowania ciągów:
quote_literal()
lubquote_nullable()
- ten ostatni wypisuje ciągNULL
dla zerowego wejścia. (Istnieje równieżquote_ident()
do podwójnego cudzysłowu ciągi znaków tam, gdzie są potrzebne, aby uzyskać prawidłowe identyfikatory SQL .)format()
ze specyfikatorem formatu%L
jest odpowiednikiemquote_nullable()
.
Lubię to:format('%L', string_var)
lubconcat()
zazwyczaj nie nadają się do tego celu, ponieważ te nie unikaj zagnieżdżonych pojedynczych cudzysłowów i ukośników odwrotnych.concat_ws()