2010-12-09 2 views
0

저는 Postgres 데이터베이스를 UTF-8로 인코딩했습니다.Postgres 데이터베이스에서 Perl 인코딩 문제를 통해 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 문서를 얻을 : 즉,

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

쿼리를 사용하여 XML 파일에 포스트 그레스 데이터베이스에서 데이터를 추출 : 나는 다음과 같은 모듈과 펄을 사용하고 있습니다 그 결과로 내 문제는 데이터베이스의 일부 데이터가 바이너리입니다. 즉 UTF-8이 아닌 문자가 있습니다. 이 경우, XML :: 발전기 :: DBI는이를 감지하고 XML 파일에 다음과 같이 데이터를 출력 :

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

네임 스페이스는 또한 URL http://axkit.org/NS/xml-generator-dbi에 바인딩됩니다. 이것은 모듈 문서에 따라 올바른 동작이지만 내가 알고 싶은 것은 : 어떻게 든이 base64로 인코딩 된 문자열을 UTF-8로 변환하여 실제로 사용할 수 있습니까?

필자는 Perl 전문가가 아니며, Postgres도 그렇게 쉽게 이해할 수 없다. 많은 감사.

답변

1

MIME::Base64을 사용하여 Base64를 디코딩 할 수 있다고 상상해보십시오. 그러나 데이터가 무엇인지에 따라 다릅니다. UTF-8 이외의 문자가있는 경우 그 문자는 무엇입니까? 당신은 무엇을 변화시켜야 하는지를 알아야합니다.

+0

답장을 보내 주셔서 감사합니다. 모듈에 대해 몰랐는데 - 감사합니다 (아직 통합하는 방법을 모르지만 아직 살펴볼 것입니다). base64로 나오는 데이터는 일반적으로 코드 샘플이므로 테이블에 저장된 Java, C++ 코딩 샘플과 같지만 반드시 그런 것은 아닙니다. 내 질문에 예를 들면,이 번역 :이 보고서는 데이터베이스 테이블에 액세스하는 모든 파일을 나열합니다. 그것은 다음과 같은 정보를 제공합니다 : File full name, accessible tables "- base64 출력을 일으키는 것은 같아야합니다 : – JamesH

+0

데이터를 실제로 확장하는 것입니다. 제 질문에 제공된 예제는 실제로 다음과 같이 저장됩니다. Postgres 데이터베이스의 내용 : "이 보고서는 데이터베이스 테이블에 대한 액세스 권한이있는 모든 파일을 나열합니다. 다음 정보를 제공합니다 : 파일 성명, 액세스 테이블 " 나는 첫 번째 전체 정지 이후에 캐리지 리턴이 있다고 믿습니다.이 예제에서 base64는": "가 UTF -8 문자를 허용하고 base64를 사용해서는 안됩니다 ... – JamesH

+0

추가 ...이 데이터를 생성하는 스크립트를 찾았습니다. 포함 된 내용은 다음과 같습니다. 이 보고서는 데이터베이스 테이블에 액세스하는 모든 파일을 나열합니다 .'! xD!''! xA!그것은 다음과 같은 정보를 제공합니다 : File full name, accessible table – JamesH

1

이 "진"은, 당신은 PostgreSQL의에서 열 유형이 다음 중 하나를 수, bytea 것을 의미 기준 :

bytea_output=escape $dbh에 설정
  1. ,과 같이 :

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

  2. 검색어에 bytea 유형의 열을 text으로 전송하십시오.

    SELECT bytea_column::text FROM ...

나는 그 중 하나가 당신이 결국 원하는 정확히 될 것입니다 의심한다. 잘하면 그 방향으로 갈 수 있기를 바랍니다.

관련 문제