En utilisant PostgreSQL 8.4, comment convertir des bytea en valeur texte en postgres?


15

Dans mon application, j'insère des données dans la base de données en utilisant du code C, puisque les chaînes que je reçois d'une source non fiable, je les ai échappées en utilisant la PQescapeByteaConnbibliothèque libpq. Ce qui fonctionne parfaitement bien, c'est-à-dire les résultats au format octet String. Voir l'exemple ci-dessous,

Chaîne d'entrée: \n\t\f\b\p\k\j\l\mestPrepared

Chaîne de sortie: \\012\\011\\014\\010pkjlmestPrepared

La chaîne de sortie est insérée dans la base de données. Maintenant, je récupère ces données de la base de données dans un code java à l'aide de JDBC. Comment récupérer la chaîne à sa valeur d'origine?

J'ai pensé à deux approches possibles,

  1. Modifiez la requête de récupération de la base de données et passez ce champ à n'importe quelle fonction de manipulation de chaîne de postgres, c'est-à-dire qui peut convertir les bytea en texte.
  2. Faites le décodage en code Java.

Je peux comprendre que l'approche 1 sera plus efficace. J'ai essayé presque toutes les fonctions énumérées ici mais rien ne fonctionne. S'il vous plaît, aidez !!

J'utilise la version 8.4 de postgres sur une machine Linux.


2
Le pilote JDBC est censé décoder les bytea. Qu'est-ce qui ne va pas ResultSet.getBytes()?
Daniel Vérité

@ DanielVérité Je vais essayer ça et vous le faire savoir
Amit

Réponses:


8

Avez-vous essayé le format encode(data bytea, format text)with escape. Dans cette syntaxe formatpeut être l'un de ces éléments,

  • base64
  • hex
  • échapper

Ainsi encode(E'123\\000456'::bytea, 'hex'), le bytea sortira au format hexadécimal.


Cela devrait être un commentaire sur la question, sauf si vous êtes sûr que cela résout le problème. Si cela résout le problème, pouvez-vous expliquer pourquoi et comment cela fonctionne au profit des futurs lecteurs?
Max Vernon

@Valgog J'ai déjà essayé ça ..
Amit

6

Pour convertir BYTEA en TEXTE, vous devez connaître l'encodage interne du texte. Sans connaître l'encodage, vous ne pouvez rien faire. Dans une textcolonne normale , la base de données stocke le texte sous la forme SERVER_ENCODINGdéfinie. Par exemple, dans votre exemple \nest traduit en \012. Eh bien, c'est une propriété de l'encodage. Ce n'est pas objectivement vrai pour l'univers.

Si vous connaissez cet encodage, c'est simple cependant ..

  1. Nous prenons votre chaîne d'entrée comme un littéral codé.
  2. Nous encode. Cela produit une chaîne d'échappement (type text).
  3. Ensuite, nous devons le décoder pour obtenir un type de bytea.
  4. Maintenant, avoir un byteane nous permet pas de revenir text. Nous devons lui dire quel format de texte byteaest utilisé convert_from. Nous lui disons UTF-8.

Voici un exemple.

SELECT convert_from(decode(x, 'escape'), 'UTF-8')
FROM encode(E'\n\t\f\b\p\k\j\l\mestPrepared'::bytea, 'escape')
  AS t(x);

4

Pour les adeptes, car cela semble être la question canonique pour "convertir les bytea en texte" (c'est-à-dire pour que vous puissiez le voir dans pgAdmin, etc.). Voici comment le rendre visible:

select encode(table.your_column_name, 'escape') as name from table_name

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.