web-dev-qa-db-fra.com

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

Dans mon application, j'insère des données dans la base de données en utilisant du code C, depuis les chaînes que je reçois d'une source non fiable, je les ai échappées en utilisant PQescapeByteaConn de la bibliothè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 en utilisant JDBC. Comment puis-je 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 Java.

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

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

16
Amit

Avez-vous essayé la encode(data bytea, format text) au format escape. Dans cette syntaxe, format peut être n'importe lequel d'entre eux,

  • base64
  • hex
  • escape

Donc encode(E'123\\000456'::bytea, 'hex') affichera le bytea sous forme hexadécimale.

8
valgog

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 colonne normale text, la base de données stocke le texte sous la forme SERVER_ENCODING est défini comme. Par exemple, dans votre exemple \n est traduit en \012. Eh bien, c'est une propriété d'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 it. Cela produit une chaîne d'échappement (tapez text).
  3. Ensuite, nous devons le décoder à nouveau pour obtenir un type de bytea.
  4. Maintenant, avoir un bytea ne nous permet pas de revenir à text. Nous devons lui dire quel format de texte que bytea utilise 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);
7
Evan Carroll

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 some_name from table_name

6
rogerdpack