string - contient - sql supprimer des caractère d'une chaine




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

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?


Cool.

J'ai aussi 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 le guillemet simple d'ouverture, par exemple E'foo '. (Lorsque vous maintenez une chaîne d'échappement constante sur plusieurs lignes, écrivez E uniquement avant le premier guillemet.) Dans une chaîne d'échappement, une barre oblique inversée (\) commence une séquence d'échappement de type barre oblique inversée semblable à celle du C, dans laquelle la combinaison de la barre oblique inversée et du caractère suivant ( s) représente une valeur d'octet spéciale. \ b est un retour arrière, \ f est un flux de formulaire, \ n est une nouvelle ligne, \ r est un retour chariot, \ t est un onglet. \ Digits, où digits représente une valeur d'octet octal, et \ xhexdigits, où hexdigits représente une valeur d'octet hexadécimale, sont également pris en charge. (Il est de votre responsabilité que les séquences d'octets que vous créez soient des caractères valides dans le codage du jeu de caractères du serveur.) Tout autre caractère suivant une barre oblique inversée est pris littéralement. Ainsi, pour inclure un caractère barre oblique inverse, écrivez deux barres obliques inverses (\\). De plus, un seul guillemet peut être inclus dans une chaîne d'échappement en écrivant \ ', en plus de la manière normale de' '.


Je trouve très improbable 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=>

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');

Question vraiment stupide: Etes-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 pas dans votre interface)? C'est-à-dire, vous attendez-vous à ce que le champ

Ce sera inséré \ n Ce ne sera pas

ou

Ce sera inséré

Ce ne sera pas

Aussi, quelle interface utilisez-vous? Est-il possible que quelque chose le long du chemin mange vos barres obliques inverses?





escaping