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 PQescapeByteaConn
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 à l'aide de JDBC. Comment récupérer la chaîne à sa valeur d'origine?
J'ai pensé à deux approches possibles,
- 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.
- 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.
ResultSet.getBytes()
?Réponses:
Avez-vous essayé le format
encode(data bytea, format text)
withescape
. Dans cette syntaxeformat
peut être l'un de ces éléments,Ainsi
encode(E'123\\000456'::bytea, 'hex')
, le bytea sortira au format hexadécimal.la source
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
text
colonne normale , la base de données stocke le texte sous la formeSERVER_ENCODING
définie. Par exemple, dans votre exemple\n
est 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 ..
encode
. Cela produit une chaîne d'échappement (typetext
).bytea
.bytea
ne nous permet pas de revenirtext
. Nous devons lui dire quel format de textebytea
est utiliséconvert_from
. Nous lui disons UTF-8.Voici un exemple.
la source
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
la source