Стрингови литерали
Екраниране на единични кавички '
като ги удвоите -> ''
е стандартният начин и работи разбира се:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Обикновени единични кавички (ASCII / UTF-8 код 39), имайте предвид, а не обратно `
, които нямат специално предназначение в Postgres (за разлика от някои други RDBMS) и нямат двойни кавички "
, използвани за идентификатори.
В стари версии или ако все още работите с standard_conforming_strings = off
или като цяло, ако добавите пред низа си с E
за да декларирате синтаксис на избягващ низ на Posix , можете също да избягате с обратната наклонена черта \
:
E'user\'s log'
Самата обратна наклонена черта се екранира с друга обратна наклонена черта. Но това обикновено не е за предпочитане.
Ако трябва да се справите с много единични кавички или множество слоеве на екраниране, можете да избегнете цитирането на ада в PostgreSQL с низове с кавички в долари :
'escape '' with '''''
$$escape ' with ''$$
За да избегнете допълнително объркване сред доларовите котировки, добавете уникален токен към всяка двойка:
$token$escape ' with ''$token$
Което може да бъде вложено произволен брой нива:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Обърнете внимание дали $
символът трябва да има специално значение във вашия клиентски софтуер. Може да се наложи да го избягате допълнително. Това не е така със стандартните PostgreSQL клиенти като psql или pgAdmin.
Всичко това е много полезно за писане на plpgsql функции или ad-hoc SQL команди. Въпреки това не може да облекчи необходимостта от използване на подготвени оператори или някакъв друг метод за защита срещу SQL инжектиране във вашето приложение, когато въвеждането от потребителя е възможно. Отговорът на @Craig има повече за това. Повече подробности:
- SQL инжекция във функциите на Postgres срещу подготвени заявки
Стойности в Postgres
Когато работите със стойности в базата данни, има няколко полезни функции за правилно цитиране на низове:
quote_literal()
илиquote_nullable()
- последният извежда низаNULL
за нулев вход. (Има същоquote_ident()
до двойни кавички низове, където са необходими за получаване на валидни SQL идентификатори .)format()
с спецификатора на формата%L
е еквивалентен наquote_nullable()
.
Като:format('%L', string_var)
илиconcat()
обикновено не са подходящи за тази цел, тъй като те не избягване на вложени единични кавички и обратна наклонена черта.concat_ws()