2010-12-09 4 views
0

J'ai une base de données Postgres codée en UTF-8. J'utilise Perl avec les modules suivants:Extraction de données de la base de données Postgres vers XML via le problème de codage Perl

use DBI 
use XML::Generator::DBI 
use XML::SAX::Writer 

pour extraire des données dans la base de données Postgres vers un fichier XML à l'aide d'une requête, à savoir:

use DBI; 
use XML::Generator::DBI; 
use XML::SAX::Writer; 

my $dbh = DBI->connect("dbi:Pg:dbname=postgres;host=MYHOST;port=2278", 
         username, 
         password, 
         {RaiseError => 1}, 
        ); 

my $handler = XML::SAX::Writer->new(Output => 'foo.xml'); 

my $generator = XML::Generator::DBI->new(
Handler => $handler, 
dbh  => $dbh, 
Indent => 1, 
); 

$select = qq(

!!!!SQL QUERY!!!!! 

); 

$generator->execute(
        $select, 
        undef, 
        RootElement => 'root', 
         ); 

Cela fonctionne bien et je reçois un document XML valide Par conséquent. Mon problème est que certaines données de la base de données sont binaires, c'est-à-dire qu'il y a des caractères non UTF-8. Lorsque cela se produit, XML :: Générateur :: DBI détecte et transmet les données comme suit dans le fichier XML:

<foo dbi:encoding='base64'>VGhpcyByZXBvcnQgbGlzdHMgYWxsIGZpbGVzIGhhdmluZyBhY2Nlc3NlcyB0byBkYXRhYmFzZSB0 
YWJsZXMuDQpJdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOiAgRmlsZSBmdWxs 
IG5hbWUsIGFjY2Vzc2VkIHRhYmxl 
</foo> 

L'espace de noms est également lié à l'URL http://axkit.org/NS/xml-generator-dbi. C'est un comportement correct selon la documentation du module, mais ce que je veux savoir c'est: est-il possible de transformer en quelque sorte cette chaîne codée en base64 en UTF-8 pour que je puisse l'utiliser?

Je ne suis pas du tout un expert Perl, pas plus que Postgres, alors allez-y doucement! Merci beaucoup.

Répondre

1

J'imagine que vous pouvez décoder le Base64 en utilisant MIME::Base64 ... Mais cela dépend de ce que sont les données. S'il y a des caractères non-UTF-8, quels sont-ils? Vous devez savoir de quoi il faut transformer.

+0

Merci pour votre réponse. Je ne savais pas sur le module - merci (je ne sais pas comment faire pour l'intégrer mais je vais y jeter un coup d'oeil). Les données qui sortent en tant que base64 sont généralement des exemples de code, par exemple Java, des exemples de codage C++ qui ont été stockés dans une table - mais pas nécessairement. Pour l'exemple de ma question, ceci se traduit par: Ce rapport liste tous les fichiers ayant accès aux tables de la base de données. Il fournit les informations suivantes: Nom complet du fichier, table accédée "- donc je suppose que cela doit être le: qui provoque la sortie base64? – JamesH

+0

Juste expansion sur ce que les données sont réellement.L'exemple que j'ai fourni dans ma question est réellement stocké comme ceci dans la base de données Postgres: "Ce rapport liste tous les fichiers ayant accès aux tables de base de données. Il fournit les informations suivantes: Nom complet du fichier, table accédée " Je pense qu'il y a un retour chariot après le premier arrêt complet Dans cet exemple, cela doit être pourquoi" base64 "est utilisé comme": "est un UTF -8 caractères autorisés et ne devrait pas provoquer l'utilisation de base64 ... – JamesH

+0

En outre ... J'ai recherché le script qui crée ces données, voici ce qui contient: Ce rapport liste tous les fichiers ayant accès aux tables de base de données. xD! ''! xA!'Il fournit les informations suivantes: Nom complet du fichier, table accédée – JamesH

1

Si par "binaire", vous voulez dire que le type de colonne dans PostgreSQL est bytea, vous pourriez alors:

  1. Set bytea_output=escape sur $dbh, comme ceci:

    $dbh->do('SET bytea_output=escape');

  2. Cast la colonne avec le type bytea à text dans votre requête:

    SELECT bytea_column::text FROM ...

Je doute l'un de ceux-ci seront exactement ce que vous voulez finir avec. J'espère que cela vous aidera à aller dans la bonne direction.

Questions connexes