Řetězcové literály a únikové znaky v PostgreSQL

hlasů
95

Při pokusu vložit znak escape do výsledků tabulky ve varování.

Například:

create table EscapeTest (text varchar(50));

insert into EscapeTest (text) values ('This is the first part \n And this is the second');

Produkuje varování:

WARNING:  nonstandard use of escape in a string literal

( Použití PSQL 8.2 )

Každý, kdo ví, jak se dostat kolem tohoto?

Položena 04/08/2008 v 02:00
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
104

Částečně. Text je vložen, ale je stále generována výstraha.

Zjistil jsem, diskusi, která je uvedena v textu muselo být předchází ‚E‘, jako například:

insert into EscapeTest (text) values (E'This is the first part \n And this is the second');

To potlačí varování, ale text ještě není vracených správně. Když jsem přidal další lomítko jako Michael navrhl, fungovalo to.

Jako takový:

insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');
Odpovězeno 04/08/2008 v 02:07
zdroj uživatelem

hlasů
32

Chladný.

Také jsem našel v dokumentaci, pokud jde o E:

http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS

PostgreSQL také přijímá „Escape“ řetězcové konstanty, které jsou rozšířením standardu SQL. Úniková řetězec konstanta je dána písemně písmenem E (velká nebo malá písmena) těsně před otevřením jediného citátu, např E'foo‘. (Při pokračování únikovou řetězec konstantní napříč linie, psát E pouze před prvním otevření nabídku.) V rámci únikové řetězec zpětné lomítko znak (\) začíná zpětné lomítko escape sekvence C-podobně, ve kterých kombinace lomítkem a následujících znaků ( y) představuje zvláštní hodnota bytu. \ B je backspace, \ f je posuv forma, \ n je nový řádek, \ r je návrat vozíku, \ t je karta. Také jsou podporovány \ míst, kde číslice představuje osmičkové byte hodnotu, a \ xhexdigits, kde hexdigits představuje hodnotu šestnáctkové bajtu. (Je to vaše odpovědnost, že byte sekvence, které vytvoříte, jsou platné znaky v charakteru serveru nastavené kódování.) Jakýkoli jiný znak po zpětné lomítko je převzat doslovně. Tak, aby obsahovat zpětné lomítko, napsat dvě zpětná lomítka (\\). Také, jednoduché uvozovky mohou být zahrnuty do únikové řetězci od psaní \‘, navíc k normálnímu způsobu‚‘.

Odpovězeno 04/08/2008 v 02:14
zdroj uživatelem

hlasů
5

Varování je vydáno, protože jste pomocí zpětných lomítek ve svých řetězcích. Chcete-li se vyhnout zprávy, zadejte tento příkaz „set standard_conforming_strings = on;“. Pak použijte „E“ před řetězec, včetně zpětných lomítek, které chcete postgresql na intrepret.

Odpovězeno 17/02/2010 v 00:51
zdroj uživatelem

hlasů
3

Považuji za vysoce nepravděpodobné, Postgres zkrátit svá data na vstup - to buď odmítne nebo uloží ji tak jak je.

milen@dev:~$ psql
Welcome to psql 8.2.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

milen=> create table EscapeTest (text varchar(50));
CREATE TABLE
milen=> insert into EscapeTest (text) values ('This will be inserted \n This will not be');
WARNING:  nonstandard use of escape in a string literal
LINE 1: insert into EscapeTest (text) values ('This will be inserted...
                                              ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
INSERT IGNORE  0 1
milen=> select * from EscapeTest;
          text
------------------------
 This will be inserted
  This will not be
(1 row)

milen=>
Odpovězeno 19/09/2008 v 20:24
zdroj uživatelem

hlasů
2

Opravdu hloupá otázka: Jsi si jistý, že řetězec je zkrácen, a to nejen rozbité na LINEBREAK určíte (a možná nezobrazují v rozhraní)? Tedy myslíš, že pole se ukáže jako

Tato se vloží \ n nebude

nebo

To bude vložen

To nebude

Také to, co rozhraní používáte? Je možné, že něco po cestě je jíst vaše zpětné lomítko?

Odpovězeno 16/09/2008 v 14:26
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more