sql >> Database >  >> RDS >> PostgreSQL

Tekst invoegen met enkele aanhalingstekens in PostgreSQL

Letterlijke tekenreeksen

Enkele aanhalingstekens ontsnappen ' door ze te verdubbelen -> '' is de standaard manier en werkt natuurlijk:

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

Duidelijke enkele aanhalingstekens (ASCII / UTF-8 code 39), let wel, geen backticks ` , die geen speciaal doel hebben in Postgres (in tegenstelling tot bepaalde andere RDBMS) en geen dubbele aanhalingstekens " , gebruikt voor identifiers.

In oude versies of als je nog steeds draait met standard_conforming_strings = off of, in het algemeen, als u uw tekenreeks voorzet met E om Posix escape-tekenreekssyntaxis te declareren , kunt u ook ontsnappen met de backslash \ :

E'user\'s log'

Backslash zelf wordt ontsnapt met een andere backslash. Maar dat heeft over het algemeen niet de voorkeur.
Als je te maken hebt met veel enkele aanhalingstekens of meerdere lagen van ontsnappingen, kun je voorkomen dat je de hel in PostgreSQL citeert met strings tussen dollar aanhalingstekens :

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

Om verwarring tussen dollaraanhalingstekens verder te voorkomen, voegt u een unieke token toe aan elk paar:

$token$escape ' with ''$token$

Die op een willekeurig aantal niveaus kan worden genest:

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

Let op als de $ karakter moet een speciale betekenis hebben in uw clientsoftware. Mogelijk moet u er bovendien aan ontsnappen. Dit is niet het geval met standaard PostgreSQL-clients zoals psql of pgAdmin.

Dat is allemaal erg handig voor het schrijven van plpgsql-functies of ad-hoc SQL-commando's. Het kan echter niet de noodzaak verlichten om voorbereide instructies of een andere methode te gebruiken om te beschermen tegen SQL-injectie in uw toepassing wanneer gebruikersinvoer mogelijk is. Het antwoord van @Craig heeft daar meer over. Meer details:

  • SQL-injectie in Postgres-functies versus voorbereide zoekopdrachten

Waarden binnen Postgres

Bij het omgaan met waarden in de database zijn er een aantal handige functies om strings correct te citeren:

  • quote_literal() of quote_nullable() - de laatste geeft de string NULL . af voor nulinvoer. (Er is ook quote_ident() naar dubbele aanhalingstekens strings waar nodig om geldige SQL identifiers te krijgen .)
  • format() met de formaatspecificatie %L is gelijk aan quote_nullable() .
    Vind ik leuk:format('%L', string_var)
  • concat() of concat_ws() zijn meestal niet geschikt voor dit doel, omdat die niet ontsnap aan geneste enkele aanhalingstekens en backslashes.


  1. ORA-01658:kan INITIAL-extent niet maken voor segment in tabelruimte TS_DATA

  2. Hoe levensshtein-functie in mysql toe te voegen?

  3. Ongeldig syntaxisfouttype =MyISAM in DDL gegenereerd door Hibernate

  4. Wat is het voordeel van zerofill in MySQL?