通过Perl编码问题将Postgres数据库中的数据提取到XML

时间:2010-12-09 15:50:45

标签: xml perl postgresql encoding character-encoding

我有一个用UTF-8编码的Postgres数据库。我使用Perl和以下模块:

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

使用查询将Postgres数据库中的数据提取到XML文件,即:

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',
                        );

这很好用,我得到了一个有效的XML文档。我的问题是数据库中的一些数据是二进制的 - 即那里有非UTF-8字符。发生这种情况时,XML :: Generator :: DBI检测到这一点并在XML文件中输出如下数据:

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

命名空间也绑定到URL http://axkit.org/NS/xml-generator-dbi。根据模块文档,这是正确的行为,但我想知道的是:是否有可能以某种方式将这个base64编码的字符串转换为UTF-8,以便我可以实际使用它?

我根本不是Perl专家,也不是Postgres,所以请轻松一点!非常感谢。

2 个答案:

答案 0 :(得分:1)

我想你可以使用MIME::Base64解码Base64 ......但它取决于数据是什么。如果有非UTF-8字符,它们是什么?你需要知道要改变什么。

答案 1 :(得分:1)

如果用“binary”表示PostgreSQL中的列类型是bytea,那么你可以:

  1. bytea_output=escape上设置$dbh,如下所示:

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

  2. 在查询中将bytea类型的列投放到text

    SELECT bytea_column::text FROM ...

  3. 我怀疑其中任何一个都不是你想要的结果。希望这会让你朝着正确的方向前进。