Вставить текст с одинарными кавычками в 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 Solutions collect form web for “Вставить текст с одинарными кавычками в PostgreSQL”

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

 '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-инъекция в функциях Postgres и подготовленных запросах

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

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

См. « Предотrotation SQL-инъекций в Java» . Не будьте следующей жертвой Бобби .

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

В PostgreSQL есть встроенные функции цитирования quote_literal и quote_ident , но они предназначены для функций 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; --'); 

Упс, там идет ваша firebase database.

Согласно документации PostgreSQL (4.1.2.1. String Constants) :

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

См. Также параметр standard_conforming_strings , который контролирует, работает ли экранирование с помощью обратных косых черт.

В postgresql, если вы хотите вставить значения с помощью ' в нем», для этого вам нужно предоставить дополнительные '

  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

  • Как добавить символ маркера в TextView?
  • Как избежать символа буквенного процента, когда включена опция NO_BACKSLASH_ESCAPES?
  • NSURL URLWithString: имеет значение null с неанглийскими акцентированными символами
  • Давайте будем гением компьютера.