Question

Toute tentative d'insertion d'un caractère d'échappement dans un tableau 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?

Était-ce utile?

La solution

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é d'un « E », en tant que tel :

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

Cela supprimait l'avertissement, mais le texte n'était toujours pas renvoyé correctement.Lorsque 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');

Autres conseils

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 « d'échappement », qui sont une extension du standard SQL.Une constante de chaîne d'échappement est spécifiée en écrivant la lettre E (majuscule ou minuscule) juste avant le guillemet simple d'ouverture, par exemple.E'foo'.(Lorsque vous continuez une chaîne d'échappement constante sur plusieurs lignes, écrivez E uniquement avant le premier guillemet d'ouverture.) Dans une chaîne d'échappement, une barre oblique inverse (\) commence une séquence d'échappement de type barre oblique inverse, dans laquelle la combinaison d'une barre oblique inverse et du caractère suivant ( s) représente une valeur d'octet spéciale.\b est un retour arrière, \f est un saut de page, est une nouvelle ligne, est un retour chariot, est une tabulation.Sont également pris en charge \digits, où les chiffres représentent une valeur d'octet octal, et \xhexdigits, où les chiffres hexadécimaux représentent une valeur d'octet hexadécimal.(Il est de votre responsabilité de vous assurer que les séquences d'octets que vous créez sont des caractères valides dans le codage 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 barre oblique inverse, écrivez deux barres obliques inverses (\\).De plus, un guillemet simple peut être inclus dans une chaîne d'échappement en écrivant \', en plus de la manière normale de ''.

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

Je trouve très improbable que Postgres tronque vos données lors de la saisie - soit il les rejette, soit 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=>

Question vraiment bête :Êtes-vous sûr que la chaîne est tronquée et pas seulement interrompue au saut de ligne que vous spécifiez (et peut-être ne s'affiche-t-elle pas dans votre interface) ?Autrement dit, vous attendez-vous à ce que le champ s'affiche comme

Ce sera inséré n ce ne sera pas

ou

Celui-ci sera inséré

Ce ne sera pas

Et quelle interface utilisez-vous ?Est-il possible que quelque chose en cours de route ronge vos barres obliques inverses ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top