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?
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');
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 ".
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.
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=>
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?