Littéraux de chaîne et caractères d'échappement dans postgresql
-
08-06-2019 - |
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?
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 ?