String-Literale
Einfache Anführungszeichen maskieren '
durch Verdoppeln -> ''
ist der Standardweg und funktioniert natürlich:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Einfache einfache Anführungszeichen (ASCII / UTF-8 Code 39), wohlgemerkt, keine Backticks `
, die in Postgres keinen besonderen Zweck haben (im Gegensatz zu bestimmten anderen RDBMS) und keine doppelten Anführungszeichen "
, verwendet für Bezeichner.
In alten Versionen oder wenn Sie noch mit standard_conforming_strings = off
laufen oder allgemein, wenn Sie Ihrer Zeichenfolge E
voranstellen Posix-Escape-String-Syntax zu deklarieren , Sie können auch mit dem Backslash \
entkommen :
E'user\'s log'
Der Backslash selbst wird mit einem weiteren Backslash maskiert. Aber das ist im Allgemeinen nicht vorzuziehen.
Wenn Sie mit vielen einfachen Anführungszeichen oder mehreren Escape-Ebenen zurechtkommen müssen, können Sie es vermeiden, die Hölle in PostgreSQL mit Zeichenfolgen in Dollar-Anführungszeichen zu zitieren :
'escape '' with '''''
$$escape ' with ''$$
Um weitere Verwirrung zwischen Dollarkursen zu vermeiden, fügen Sie jedem Paar ein eindeutiges Token hinzu:
$token$escape ' with ''$token$
Welche beliebig viele Ebenen verschachtelt werden können:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Achten Sie darauf, ob das $
sollte in Ihrer Client-Software eine besondere Bedeutung haben. Möglicherweise müssen Sie es zusätzlich entkommen. Dies ist bei Standard-PostgreSQL-Clients wie psql oder pgAdmin nicht der Fall.
Das ist alles sehr nützlich, um plpgsql-Funktionen oder Ad-hoc-SQL-Befehle zu schreiben. Es kann jedoch nicht die Notwendigkeit verringern, vorbereitete Anweisungen oder eine andere Methode zum Schutz vor SQL-Injection in Ihrer Anwendung zu verwenden, wenn Benutzereingaben möglich sind. @Craigs Antwort enthält mehr dazu. Weitere Einzelheiten:
- SQL-Injection in Postgres-Funktionen im Vergleich zu vorbereiteten Abfragen
Werte in Postgres
Beim Umgang mit Werten innerhalb der Datenbank gibt es ein paar nützliche Funktionen, um Strings richtig in Anführungszeichen zu setzen:
quote_literal()
oderquote_nullable()
- letzteres gibt den StringNULL
aus für Nulleingabe. (Es gibt auchquote_ident()
in doppelte Anführungszeichen Zeichenfolgen, wo sie benötigt werden, um gültige SQL-Identifikatoren zu erhalten .)format()
mit dem Formatbezeichner%L
entsprichtquote_nullable()
.
Zum Beispiel:format('%L', string_var)
oderconcat()
sind normalerweise nicht für diesen Zweck geeignet, da diese nicht Escape verschachtelte einfache Anführungszeichen und Backslashes.concat_ws()