我有一个用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,所以请轻松一点!非常感谢。
答案 0 :(得分:1)
我想你可以使用MIME::Base64解码Base64 ......但它取决于数据是什么。如果有非UTF-8字符,它们是什么?你需要知道要改变什么。
答案 1 :(得分:1)
如果用“binary”表示PostgreSQL中的列类型是bytea
,那么你可以:
在bytea_output=escape
上设置$dbh
,如下所示:
$dbh->do('SET bytea_output=escape');
在查询中将bytea
类型的列投放到text
:
SELECT bytea_column::text FROM ...
我怀疑其中任何一个都不是你想要的结果。希望这会让你朝着正确的方向前进。