PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wstaw tekst z pojedynczymi cudzysłowami w PostgreSQL

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() lub quote_nullable() - ten ostatni wypisuje ciąg NULL 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 odpowiednikiem quote_nullable() .
    Lubię to:format('%L', string_var)
  • concat() lub concat_ws() zazwyczaj nie nadają się do tego celu, ponieważ te nie unikaj zagnieżdżonych pojedynczych cudzysłowów i ukośników odwrotnych.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Niekompatybilność Openshift i net-ssh? (2.9.3-beta1 vs 2.9.2)

  2. Polecenie Postgresql COPY dające błąd odmowy uprawnień

  3. Aby zignorować zduplikowane klucze podczas „kopiowania z” w postgresql

  4. Używanie docker-compose do tworzenia tabel w bazie postgresql

  5. Różnica między indeksem GiST i GIN