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

( Utiliser PSQL 8.2 )

Quelqu'un sait comment contourner cela?

0

4 Réponses

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 (majuscule ou minuscule) juste avant la guillemets simples d'ouverture, par ex. E'foo '. Dans une chaîne d'échappement, une barre oblique inversée (\) commence une séquence d'échappement de type barre oblique inverse de type C, dans laquelle la combinaison de la 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 formulaire, \ n est un retour à la ligne, \ r est un retour chariot, \ t est un onglet. Sont également supportés \ digits, où les chiffres représentent une valeur d'octet octet, et \ xhexdigits, où hexdigits représente une valeur d'octet hexadécimale. (Il est de votre responsabilité que les séquences d'octets que vous créez soient 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 une barre oblique inverse, écrivez deux barres obliques inverses (\\). En outre, une simple citation peut être incluse dans une chaîne d'échappement en écrivant \ ', en plus de la manière normale de' '.

0
ajouté

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. Quand j'ai ajouté le slash supplémentaire comme Michael l'a suggéré, ça a marché.

En tant que tel:

insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');
0
ajouté
Notez que sur PostgreSQL 9.0 E'testing \\ x20double-slash 'sera évalué comme' testing \\ x20double-slash ', donc seule l'approche single-slash fonctionne pour les littéraux de style E'string'
ajouté l'auteur Alexander, source
ajouté l'auteur Pitt, source
psql \ copy note: J'ai trouvé que E '\ n' a été écrit comme '\ n' plutôt que comme un retour à la ligne quand je l'utilisait dans l'argument de la requête à la méta-commande `\ copy 'de psql.
ajouté l'auteur Stew, source

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

[email protected]:~$ 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=>
0
ajouté
S'il vous plaît essayez le cas de test que j'ai donné et vous le verrez par vous-même.
ajouté l'auteur rjohnston, source
Intéressant, on dirait que le problème était dans le pilote JDBC alors, car le texte sortant de la base de données était très certainement tronqué ...
ajouté l'auteur rjohnston, source
Postgres tronque les données à l'entrée dans certaines situations très spécifiques. Par exemple, une colonne variant variant (4) en fonction de l'entrée "test" (deux espaces après le mot, 6 caractères) va tronquer les espaces et stocker la valeur "test". En règle générale, cependant, vous pouvez supposer que Postgres va corriger plutôt que de tronquer vos données.
ajouté l'auteur Bryson, source

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 = on;". Ensuite, utilisez "E" avant votre chaîne, y compris les barres obliques inverses que vous voulez postgresql à intrepret.

0
ajouté
Je faisais référence aux chaînes dans les instructions SQL, alors que vous utilisez maintenant une commande psql. Avez-vous la même erreur en utilisant la commande COPY au lieu de \ copy?
ajouté l'auteur eppesuig, source
C'est la bonne réponse. Les versions modernes de PG sont désormais activées par défaut.
ajouté l'auteur jpmc26, source