Wstaw tekst z pojedynczymi cudzysłowami w PostgreSQL

Mam tabelę test(id,name).

Muszę wstawić wartości takie jak: 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');

Dostaję błąd, jeśli uruchamiam którąkolwiek z powyższych instrukcji.

Jeśli istnieje jakakolwiek metoda, aby to zrobić poprawnie, podziel się. Nie chcę żadnych przygotowanych oświadczeń.

Czy jest to możliwe przy użyciu mechanizmu ucieczki sql?

Author: a_horse_with_no_name, 2012-09-07

6 answers

Unikanie pojedynczych cudzysłowów ' przez podwojenie ich - > '' jest standardowym sposobem i działa oczywiście.

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

W starych wersjach lub jeśli nadal uruchamiasz z standard_conforming_strings = off lub, ogólnie, jeśli poprzedzasz swój łańcuch E aby zadeklarować Posix escape string syntax , możesz również uciec z odwrotnym ukośnikiem \:

E'user\'s log'

Ale to na ogół nie jest lepsze.
Jeśli masz do czynienia z wieloma pojedynczymi cytatami lub wieloma warstwami ucieczki, możesz uniknąć cytowania piekło w PostgreSQL z Dolar-cytowane ciągi:

'escape '' with '''''
$$escape ' with ''$$
Aby jeszcze bardziej uniknąć nieporozumień między notowaniami dolarowymi, dodaj unikalny token do każdej pary:
$token$escape ' with ''$token$

Które można zagnieżdżać dowolną liczbę poziomów:

$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$

Zwróć uwagę, czy znak $ powinien mieć specjalne znaczenie w oprogramowaniu klienta. Być może będziesz musiał uciec. Nie jest tak w przypadku standardowych klientów PostgreSQL, takich jak psql czy pgAdmin.

To wszystko jest bardzo przydatne do pisania funkcji plpgsql lub poleceń ad-hoc SQL. Nie może to jednak złagodzić konieczności używania preparowanych instrukcji lub innej metody w celu zabezpieczenia przed iniekcją SQL w Twojej aplikacji, gdy wprowadzanie danych przez użytkownika jest możliwe. @Craig ' s answer ma więcej na ten temat. Więcej szczegółów:

 512
Author: Erwin Brandstetter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-19 15:43:10

To jest tak wiele złych światów, ponieważ twoje pytanie sugeruje, że prawdopodobnie masz otwory SQL injection w swojej aplikacji.

Powinieneś używać sparametryzowanych instrukcji. Dla Javy, użyj PreparedStatement with placeholders . Mówisz, że nie chcesz używać sparametryzowanych wyrażeń, ale nie wyjaśniasz dlaczego i szczerze mówiąc, to musi być bardzo dobry powód, aby ich nie używać, ponieważ są najprostszym i najbezpieczniejszym sposobem rozwiązania problemu, który próbujesz rozwiązać rozwiąż.

Zobacz zapobieganie wstrzykiwaniu SQL w Javie . Nie bądź kolejną ofiarą Bobby'ego.

W PgJDBC nie ma publicznej funkcji do cytowania łańcuchów i interpretacji znaków. Po części dlatego, że może to wydawać się dobrym pomysłem.

Istnieją wbudowane funkcje cytowania quote_literal i quote_ident w PostgreSQL, ale są one dla PL/PgSQL funkcji, które używają EXECUTE. Obecnie {[3] } jest w większości przestarzały przez EXECUTE ... USING, czyli sparametryzowaną wersję , bo to jest bezpieczniejsze i łatwiejsze. Nie możesz ich używać do celów, które tutaj wyjaśnisz, ponieważ są to funkcje po stronie serwera.


Wyobraź sobie, co się stanie, jeśli otrzymasz wartość ');DROP SCHEMA public;-- od złośliwego użytkownika. Produkowałbyś:

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

Który dzieli się na dwa stwierdzenia i komentarz, który jest ignorowany:

insert into test values (1,'');
DROP SCHEMA public;
--');
UPS, twoja baza danych.
 39
Author: Craig Ringer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 11:56:49

Zgodnie z dokumentacją PostgreSQL (4.1.2.1. Stałe Łańcuchowe):

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

Zobacz także parametr standard_conforming_strings , który kontroluje, czy działa funkcja ucieczki z odwrotnymi ukośnikami.

 15
Author: Claudix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 11:51:16

W postgresql jeśli chcesz wstawić do niego wartości z ' to w tym celu musisz podać dodatkowe '

 insert into test values (1,'user''s log');
 insert into test values (2,'''my users''');
 insert into test values (3,'customer''s');
 6
Author: Hunter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 20:44:21

Możesz użyć funkcji postrgesql chr (int):

insert into test values (2,'|| chr(39)||'my users'||chr(39)||');
 3
Author: Slava Struminski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-29 10:00:36

Jeśli musisz wykonać pracę wewnątrz Pg:

to_json(value)

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

 1
Author: hatenine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-18 17:01:02