Littéraux de chaîne et caractères d'échappement dans postgresql

Tenter d'insérer un caractère d'échappement dans une table entraîne un avertissement.

Par exemple:

create table EscapeTest (text varchar(50));

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

Produit l'avertissement:

WARNING:  nonstandard use of escape in a string literal

(utilisation de PSQL 8.2)

Quelqu'un sait comment contourner cela?

95
demandé sur Damjan Pavlica 2008-08-04 05:00:24

5 réponses

Partiellement. Le texte est inséré, mais l'avertissement est généré.

J'ai trouvé une discussion qui indiquait que le texte devait être précédé de 'E', en tant que tel:

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

Cela a supprimé l'avertissement, mais le texte n'était toujours pas renvoyé correctement. Quand j'ai ajouté la barre oblique supplémentaire comme Michael l'a suggéré, cela a fonctionné.

En tant Que tel:

insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');
109
répondu rjohnston 2010-03-04 23:08:11

Cool.

J'ai également trouvé la documentation concernant le E:

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

PostgreSQL accepte également les constantes de chaîne "escape", qui sont une extension du standard SQL. Une constante de chaîne d'échappement est spécifiée en écrivant la lettre E (majuscules ou minuscules) juste avant le guillemet simple d'ouverture, par exemple E'foo'. (Lorsque vous continuez une constante de chaîne d'échappement à travers les lignes, écrivez E seulement avant la première citation d'ouverture.) Dans une chaîne d'échappement, un caractère antislash ( \ ) commence une séquence d'échappement antislash de type C, dans laquelle la combinaison de la barre oblique inverse et du(DES) caractère (s) suivant (s) représente une valeur d'octet spéciale. \b est un retour arrière, \f est une forme d'alimentation, \n est un saut de ligne \r retour chariot \t est un onglet. Sont également pris en charge \digits, où digits représente une valeur d'octet, et \xhexdigits, où hexdigits représente une valeur d'octet hexadécimal. (Il est de votre responsabilité que les séquences d'octets que vous créez sont des caractères valides dans l'encodage du jeu de caractères du serveur.) Tout autre caractère suivant une barre oblique inverse est pris littéralement. Ainsi, pour inclure un caractère antislash, écrivez deux antislashs (\\). Aussi, une apostrophe peut être inclus dans une chaîne d'échappement en écrivant \', en plus de la manière normale de ".

32
répondu Michael Stum 2008-08-04 01:14:57

L'avertissement est émis car vous utilisez des barres obliques inverses dans vos chaînes. Si vous voulez éviter le message, tapez cette commande "set standard_conforming_strings=sur;". Ensuite, utilisez " E " avant votre chaîne, y compris les barres obliques inverses que vous voulez que postgresql intrepret.

5
répondu eppesuig 2010-02-16 23:51:23

Je trouve très peu probable que Postgres tronque vos données en entrée - il les rejette ou les stocke telles quelles.

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 0 1
milen=> select * from EscapeTest;
          text
------------------------
 This will be inserted
  This will not be
(1 row)

milen=>
3
répondu Milen A. Radev 2008-09-27 16:04:29

Question vraiment stupide: êtes-vous sûr que la chaîne est tronquée, et pas seulement cassée au saut de ligne que vous spécifiez (et peut-être ne pas apparaître dans votre interface)? Ie, attendez-vous que le champ s'affiche comme

Ceci sera inséré \n cela ne sera pas soit

Ou

Ce sera inséré

Ce ne sera pas

Aussi, quelle interface utilisez-vous? Est-il possible que quelque chose en cours de route mange vos antislashs?

2
répondu 2008-09-16 13:26:04