132 votes

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

Toute tentative d'insertion d'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?

150voto

rjohnston Points 2450

Partiellement. Le texte est inséré, mais l'avertissement est toujours 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. Lorsque j'ai ajouté la barre oblique supplémentaire suggérée par Michael, cela a fonctionné.

En tant que tel:

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

48voto

Michael Stum Points 72046

Cool.

J'ai aussi trouvé de la documentation concernant le E:

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

PostgreSQL accepte aussi de "fuite" des constantes de chaîne, qui sont une extension de la norme SQL. Une fuite constante de chaîne est spécifié par l'écriture de la lettre E (majuscule ou minuscule) juste avant l'ouverture des guillemets simples, par exemple E'foo'. (En cas de poursuite d'une chaîne d'échappement constant à travers les lignes, écrivez E seulement avant le premier guillemet d'ouverture.) Au sein d'une chaîne d'échappement, un caractère barre oblique inverse (\) commence un C-comme d'échappement barre oblique inverse de la séquence, dans laquelle la combinaison de barre oblique inverse et le caractère suivant(s) constitue une valeur d'un octet. \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 \chiffres, où les chiffres représente une octal valeur d'un octet, et \xhexdigits, où hexdigits représente un octet hexadécimal valeur. (Il est de votre responsabilité que les séquences d'octets que vous créez sont des caractères valides dans le jeu de caractères du serveur encodage). Tout autre caractère à la suite d'une barre oblique inverse est pris à la lettre. Ainsi, pour inclure une barre oblique inverse, d'écrire deux barres obliques inverses ( \ ). Aussi, une apostrophe peut être inclus dans une chaîne d'échappement en écrivant \', en plus de la manière normale de ".

10voto

Michael Stum Points 72046

Est-ce que doubler le \ travail?

  insert into EscapeTest (text) values ('This will be inserted \\n This will not be'); 

6voto

eppesuig Points 482

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X