Извлечение данных из базы данных Postgres в XML через Perl - проблема с кодировкой - PullRequest
0 голосов
/ 09 декабря 2010

У меня есть база данных Postgres, закодированная в UTF-8. Я использую 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 ]

1 голос
/ 05 апреля 2014

Если под «двоичным» вы подразумеваете, что тип столбца в PostgreSQL равен bytea, то вы можете либо:

  1. Установить bytea_output=escape на $dbh, например,:

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

  2. Приведите столбец с типом bytea к text в вашем запросе:

    SELECT bytea_column::text FROM ...

Я сомневаюсь, что любой из них будет именно тем, чем вы хотите закончить.Надеюсь, это поможет вам двигаться в правильном направлении.

1 голос
/ 09 декабря 2010

Я полагаю, что вы можете декодировать Base64, используя MIME :: Base64 ... Но это зависит от данных.Если в нем есть символы не-UTF-8, что они?Вам нужно знать, из чего трансформироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...