Вставка текста с одинарными кавычками в PostgreSQL

у меня есть таблица test(id,name).

мне нужно вставить значения, как: user's log, 'my user', customer's.

 insert into test values (1,'user's log');
 insert into test values (2,''my users'');
 insert into test values (3,'customer's');

я получаю ошибку, если я запускаю любой из вышеуказанных операторов.

если есть какой-либо способ, чтобы сделать это правильно, Пожалуйста, поделитесь. Я не хочу никаких подготовленных заявлений.

возможно ли использовать механизм экранирования sql?

6 ответов


экранирование одинарных кавычек ' удваивая их ->'' является стандартным способом и работает, конечно.

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

в старых версиях или если вы все еще работаете с standard_conforming_strings = off или, как правило, если вы добавляете строку с E объявить синтаксис escape-строки 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 или специальных команд SQL. Однако это не может облегчить необходимость использования подготовленных операторов или какого-либо другого метода для защиты от SQL-инъекции в приложении, когда возможен ввод данных пользователем. @Крейга больше на это. Более детально:


это так много плохих миров, потому что ваш вопрос подразумевает, что у вас, вероятно, есть зияющие SQL-инъекций дыры в вашем приложении.

вы должны использовать параметризованные инструкции. Для Java, используйте PreparedStatement с заполнителями. Вы говорите, что не хотите использовать параметризованные операторы, но вы не объясняете почему, и, честно говоря, это должна быть очень веская причина не использовать их, потому что они самый простой и безопасный способ исправить проблема, которую вы пытаетесь решить.

посмотреть предотвращение SQL-инъекции в Java. Не будь!--23-->Боббиследующая жертва s.

в PgJDBC нет публичной функции для цитирования и экранирования строк. Это отчасти потому, что это может показаться хорошей идеей.

здесь are встроенные функции цитирования quote_literal и quote_ident в PostgreSQL, но они для PL/PgSQL функции, которые использовать EXECUTE. Эти дни quote_literal в основном устарел EXECUTE ... USING, который является параметрировать версия, потому что безопасное и легче. Вы не можете использовать их для целей, которые вы объясняете здесь, потому что они являются серверными функциями.


представьте, что произойдет, если вы получите значение ');DROP SCHEMA public;-- от злонамеренного пользователя. Вы производите:

insert into test values (1,'');DROP SCHEMA public;--');

который разбивается на два оператора и комментарий, который получает проигнорировано:

insert into test values (1,'');
DROP SCHEMA public;
--');

Упс, вон идет ваша база данных.


по данным документация PostgreSQL (4.1.2.1. Строковые Константы):

 To include a single-quote character within a string constant, write two 
 adjacent single quotes, e.g. 'Dianne''s horse'.

см. также standard_conforming_strings параметр, который контролирует, работает ли экранирование с обратными косыми чертами.


в PostgreSQL, если вы хотите вставить значения с ' в нем тогда для этого вы должны дать extra '

 insert into test values (1,'user''s log');
 insert into test values (2,'''my users''');
 insert into test values (3,'customer''s');

вы можете использовать функцию postrgesql chr (int):

insert into test values (2,'|| chr(39)||'my users'||chr(39)||');

Если вам нужно выполнить работу внутри Pg:

to_json(value)

https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE