Literais de string
Escapando aspas simples
'
dobrando-os -> ''
é a maneira padrão e funciona, é claro:'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Aspas simples simples (ASCII / UTF-8 código 39), lembre-se, não acentos graves
`
, que não tem nenhum propósito especial no Postgres (diferentemente de alguns outros RDBMS) e não aspas duplas "
, usado para identificadores. Em versões antigas ou se você ainda executa com
standard_conforming_strings = off
ou, geralmente, se você preceder sua string com E
para declarar Sintaxe de string de escape Posix , você também pode escapar com a barra invertida \
:E'user\'s log'
A própria barra invertida é escapada com outra barra invertida. Mas isso geralmente não é preferível.
Se você tiver que lidar com muitas aspas simples ou várias camadas de escape, evite citar hell no PostgreSQL com strings entre aspas em dólar :
'escape '' with '''''
$$escape ' with ''$$
Para evitar ainda mais confusão entre cotações de dólares, adicione um token exclusivo a cada par:
$token$escape ' with ''$token$
Que pode ser aninhado em qualquer número de níveis:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Preste atenção se o
$
deve ter um significado especial em seu software cliente. Você pode ter que escapar disso além disso. Este não é o caso de clientes PostgreSQL padrão como psql ou pgAdmin. Isso tudo é muito útil para escrever funções plpgsql ou comandos SQL ad-hoc. No entanto, ele não pode aliviar a necessidade de usar instruções preparadas ou algum outro método para proteger contra injeção de SQL em seu aplicativo quando a entrada do usuário for possível. A resposta de @Craig tem mais sobre isso. Mais detalhes:
- Injeção de SQL em funções do Postgres versus consultas preparadas
Valores dentro do Postgres
Ao lidar com valores dentro do banco de dados, existem algumas funções úteis para citar strings corretamente:
quote_literal()
ouquote_nullable()
- o último gera a stringNULL
para entrada nula. (Há tambémquote_ident()
para aspas duplas strings quando necessário para obter identificadores SQL válidos .)format()
com o especificador de formato%L
é equivalente aquote_nullable()
.
Como:format('%L', string_var)
ouconcat()
normalmente não são bons para esse propósito, pois não escape de aspas simples e barras invertidas.concat_ws()