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,
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.
Avez-vous essayé la encode(data bytea, format text)
au format escape
. Dans cette syntaxe, format
peut être n'importe lequel d'entre eux,
Donc encode(E'123\\000456'::bytea, 'hex')
affichera le bytea sous forme hexadécimale.
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 ..
encode
it. Cela produit une chaîne d'échappement (tapez text
).bytea
.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);
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