Literais de string
Escapar aspas simples '
dobrando-as -> ''
é a maneira padrão e funciona, é claro:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Nas versões antigas, ou se você ainda executa com standard_conforming_strings = off
, ou, geralmente, se você anexa sua sequência E
para declarar a sintaxe da sequência de escape Posix , também é possível escapar com a barra invertida \
:
E'user\'s log'
A barra invertida em si é escapada com outra barra invertida. Mas isso geralmente não é preferível.
Se você precisar lidar com muitas aspas simples ou múltiplas camadas de escape, evite citar o inferno no PostgreSQL com cadeias de caracteres cotadas em dólar :
'escape '' with '''''
$$escape ' with ''$$
Para evitar ainda mais confusão entre cotações em dólar, adicione um token exclusivo para 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 $
personagem tiver um significado especial no software cliente. Você pode ter que escapar disso também. Este não é o caso de clientes padrão do PostgreSQL como psql ou pgAdmin.
Isso é muito útil para escrever funções plpgsql ou comandos SQL ad-hoc. 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 é possível. A resposta de Craig tem mais sobre isso. Mais detalhes:
Valores dentro do Postgres
Ao lidar com valores dentro do banco de dados, existem algumas funções úteis para citar seqüências de caracteres corretamente:
quote_literal()
ouquote_nullable()
- o último gera a string NULL
para entrada nula. (Há também quote_ident()
a aspas duplas cordas quando necessário para obter SQL válidas identificadores .)
format()
com o especificador de formato %L
é equivalente a quote_nullable()
.
Gostar:format('%L', string_var)
concat()
ouconcat_ws()
normalmente não são boas, pois elas não escapam de aspas simples e barras invertidas.