แยกข้อมูลจากฐานข้อมูล Postgres ไปยัง XML ผ่าน Perl - ปัญหาการเข้ารหัส

ฉันมีฐานข้อมูล 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 สำหรับเรื่องนั้น ง่ายๆ เลย! ขอบคุณมาก.


person JamesH    schedule 09.12.2010    source แหล่งที่มา


คำตอบ (2)


ฉันคิดว่าคุณสามารถถอดรหัส Base64 ได้โดยใช้ MIME::Base64 ...แต่ก็ขึ้นอยู่กับว่าข้อมูลนั้นคืออะไร หากมีอักขระที่ไม่ใช่ UTF-8 อยู่ อักขระเหล่านั้นคืออะไร คุณต้องรู้ว่าจะแปลงจากอะไร

person FalseVinylShrub    schedule 09.12.2010
comment
ขอบคุณสำหรับการตอบกลับของคุณ. ไม่ทราบเกี่ยวกับโมดูล - ขอบคุณ (ยังไม่แน่ใจว่าจะบูรณาการโมดูลนั้นอย่างไร แต่เราจะพิจารณาต่อไป) โดยทั่วไปข้อมูลที่ออกมาเป็น base64 คือตัวอย่างโค้ด ดังนั้น ตัวอย่างเช่น ตัวอย่างการเขียนโค้ด Java, C++ ที่ถูกจัดเก็บไว้ในตาราง - แต่ไม่จำเป็นเสมอไป สำหรับตัวอย่างในคำถามของฉัน สิ่งนี้แปลเป็น: รายงานนี้แสดงรายการไฟล์ทั้งหมดที่มีสิทธิ์เข้าถึงตารางฐานข้อมูล โดยให้ข้อมูลต่อไปนี้: ชื่อเต็มของไฟล์ ตารางที่เข้าถึง - ดังนั้นฉันเดาว่ามันต้องเป็น : ที่ทำให้เกิดเอาต์พุต base64 หรือไม่ - person JamesH; 10.12.2010
comment
เพียงขยายว่าข้อมูลที่แท้จริงคืออะไร ตัวอย่างที่ฉันให้ไว้ในคำถามของฉันถูกจัดเก็บไว้ในฐานข้อมูล Postgres จริง ๆ แล้ว: รายงานนี้แสดงรายการไฟล์ทั้งหมดที่มีสิทธิ์เข้าถึงตารางฐานข้อมูล โดยจะให้ข้อมูลต่อไปนี้: ชื่อเต็มของไฟล์, ตารางที่เข้าถึงได้ เช่น ฉันเชื่อว่ามีรถม้าไปกลับที่นั่นหลังจากหยุดเต็มครั้งแรกแล้ว ในตัวอย่างนี้ นี่คงเป็นสาเหตุว่าทำไมจึงใช้ base64 เป็น : เป็นอักขระที่อนุญาต UTF-8 และไม่ควรทำให้เกิดการใช้ base64... - person JamesH; 10.12.2010
comment
เพิ่มเติม... ฉันค้นหาสคริปต์ที่สร้างข้อมูลนี้ นี่คือสิ่งที่ประกอบด้วย: รายงานนี้แสดงรายการไฟล์ทั้งหมดที่มีการเข้าถึงตารางฐานข้อมูล!xD!``!xA!ให้ข้อมูลต่อไปนี้: ชื่อเต็มของไฟล์, ตารางที่เข้าถึงได้ - person JamesH; 10.12.2010
comment
โอเค ฉันไม่แน่ใจว่าทำไมจึงแปลเป็น Base64 การส่งคืนรถเป็นอักขระที่ถูกต้องสมบูรณ์ใน UTF-8 คุณแน่ใจหรือไม่ว่า XML::Generator::DBI เป็นโมดูลที่ดีที่สุด แล้วการใช้ DBI ธรรมดาและ XML::Generator ธรรมดาและทำบิตที่อยู่ตรงกลางด้วยตัวเองล่ะ? ฉันมีเวลาไม่มากที่จะอุทิศให้กับสิ่งนี้ แต่ถ้าคุณพอใจกับก้าวนี้ โปรดแสดงความคิดเห็นต่อไป แล้วฉันจะอัปเดตคำตอบเมื่อฉันได้แนวคิดที่ชัดเจนยิ่งขึ้น ;-) - person FalseVinylShrub; 10.12.2010

หากใช้ "binary" คุณหมายถึงประเภทคอลัมน์ใน PostgreSQL คือ bytea คุณก็ทำอย่างใดอย่างหนึ่งต่อไปนี้ได้

  1. ตั้งค่า bytea_output=escape เป็น $dbh เช่น:

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

  2. ส่งคอลัมน์ที่มีประเภท bytea ถึง text ในข้อความค้นหาของคุณ:

    SELECT bytea_column::text FROM ...

ฉันสงสัยว่าสิ่งใดสิ่งหนึ่งจะเป็นสิ่งที่คุณต้องการลงเอยอย่างแน่นอน หวังว่านั่นจะทำให้คุณไปในทิศทางที่ถูกต้อง

person Dave Gray    schedule 04.04.2014