web-dev-qa-db-fra.com

Stocke une chaîne avec des caractères spéciaux tels que des guillemets ou des barres obliques inverses dans la table postgresql

J'ai une ficelle de valeur

'MAX DATE QUERY: SELECT iso_timestamp(MAX(time_stamp)) AS MAXTIME FROM observation WHERE offering_id = 'HOBART''

Mais en insérant dans la table postgresql, je reçois une erreur:

org.postgresql.util.PSQLException: ERROR: erreur de syntaxe égale ou proche de "HOBART".

C'est probablement parce que ma chaîne contient des guillemets simples. Je ne connais pas ma valeur de chaîne. Chaque fois, il change constamment et peut contenir des caractères spéciaux tels que\ou quelque chose puisque je lis un fichier et que je l’enregistre dans la base de données postgres.

S'il vous plaît donner une solution générale pour échapper à ces caractères.

6
shomik naik

Conformément au standard SQL, les guillemets sont délimités en les doublant, à savoir:

insert into table (column) values ('I''m OK')

Si vous remplacez chaque single citation dans votre texte par deux guillemets simples, cela fonctionnera.

Normalement, une barre oblique inverse échappe au caractère suivant, mais des barres obliques inverses littérales sont également évitées en utilisant deux barres obliques inverses "

insert into table (column) values ('Look in C:\\Temp')
10
Bohemian

Vous semblez utiliser Java et JDBC. Veuillez lire le tutoriel JDBC, qui explique comment utiliser requêtes paramétrées pour insérer des données en toute sécurité sans risque de problèmes injection SQL .

Veuillez lire les section des instructions préparées du didacticiel JDBC } et ces exemples simples dans diverses langues, y compris Java .

Puisque vous avez des problèmes avec les barres obliques inverses, pas seulement 'single quotes', je dirais que vous utilisez PostgreSQL 9.0 ou une version antérieure, qui par défaut est standard_conforming_strings = off. Dans les versions plus récentes, les barres obliques inverses ne sont spéciales que si vous utilisez l'extension PostgreSQL ™ E'escape strings'. (C’est pourquoi vous incluez toujours votre version de PostgreSQL dans les questions).

Vous voudrez peut-être aussi examiner:

Bien qu'il soit possible de citer explicitement les valeurs, le faire est sujet aux erreurs, lent et inefficace. Vous devez utiliser des requêtes paramétrées (instructions préparées) pour en toute sécurité insérer des données.

A l'avenir, veuillez inclure un extrait de code avec lequel vous rencontrez un problème et des détails sur la langue que vous utilisez, la version de PostgreSQL, etc.

Si vous devez réellement échapper manuellement les chaînes, vous devez vous assurer que standard_conforming_strings est activé et entre guillemets, par exemple don''t manually escape text; ou utilisez E'escape strings where you \'backslash escape\' quotes' spécifique à PostgreSQL. Mais vraiment, utilisez des déclarations préparées, c'est beaucoup plus facile.

5
Craig Ringer

Les littéraux dans SQLServer commencent par N comme ceci:

update table set stringField = N'/;l;sldl;'''mess'
0
ACamargo

Certaines approches possibles sont:

  1. utiliser des déclarations préparées
  2. convertir tous les caractères spéciaux en entités HTML équivalentes. 
  3. utilisez le codage base64 lors du stockage de la chaîne et le décodage base64 lors de la lecture de la chaîne à partir de la table de base de données.

L’approche 1 (déclarations préparées) peut être combinée avec les approches 2 et 3.

L'approche 3 (encodage base64) convertit tous les caractères en caractères hexadécimaux sans perdre aucune information. Mais vous ne pourrez peut-être pas faire de recherche en texte intégral en utilisant cette approche.

0
raj kumar