Вставить текст с одинарными кавычками в 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 escape-механизм?

10 ответов

Решение

Избегание одинарных кавычек ' удвоив их -> '' это стандартный способ и работает, конечно.

'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 в вашем приложении, когда возможен ввод данных пользователем. Ответ @ Крейга имеет больше об этом. Больше деталей:

Согласно документации 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, который определяет, работает ли экранирование с обратной косой чертой.

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

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

См. Предотвращение внедрения SQL в Java. Не будь следующей жертвой Бобби.

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

Есть встроенные функции цитирования 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, если вы хотите вставить значения с ' в этом то для этого вы должны дать '

 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)||');

Когда я использовал Python для вставки значений в PostgreSQL, я также столкнулся с вопросом: столбец «xxx» не существует.

Я нахожу причину в wiki.postgresql:

PostgreSQL использует для этого только одинарные кавычки (т.е. WHERE name = 'John'). Двойные кавычки используются для обозначения системных идентификаторов; имена полей, имена таблиц и т. д. (т.е. WHERE "last name" = 'Smith').
MySQL использует `(знак ударения или обратная галочка) для обозначения системных идентификаторов, что явно нестандартно.

Это означает, что PostgreSQL может использовать только одинарные кавычки для имен полей, имен таблиц и т. д. Таким образом, вы не можете использовать одинарные кавычки в значении.

Моя ситуация такова: я хочу вставить в PostgreSQL значения «разница между этим adj для sb и его adj для sb».

Как я понимаю эту проблему:

я заменяю на , и я заменяю "с '. Поскольку значение PostgreSQL не поддерживает двойные кавычки.

Поэтому я думаю, что вы можете использовать следующие коды для вставки значений:

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

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

to_json(value)

https://www.postgresql.org/docs/9.3/static/functions-json.html

Вы должны добавить дополнительные одинарные кавычки -> ' и сделать их двойными кавычками, как показано ниже в примерах -> ' ' - это стандартный способ и, конечно, работает:

Неправильный путь: "журнал пользователя"
Правильный путь: "журнал пользователя"

проблема:

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

Решения:

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

Строковая константа в SQL - это произвольная последовательность символов, заключенная в одинарные кавычки ('), например «Это строка». Чтобы включить символ одинарной кавычки в строковую константу, напишите две смежные одинарные кавычки, например, «Лошадь Дайанны». Обратите внимание, что это не то же самое, что символ двойной кавычки (").

https://www.postgresql.org/docs/9.4/sql-syntax-lexical.html

Другие вопросы по тегам