ใช้ PostgreSQL 8.4 จะแปลง bytea เป็นค่าข้อความใน postgres ได้อย่างไร?


16

ในแอปพลิเคชันของฉันฉันใส่ข้อมูลในฐานข้อมูลโดยใช้รหัส C เนื่องจากสตริงที่ฉันได้รับจากแหล่งที่ไม่น่าเชื่อถือฉันได้หนีพวกเขาโดยใช้PQescapeByteaConnไลบรารี libpq ซึ่งทำงานได้ดีอย่างสมบูรณ์เช่นผลลัพธ์ในรูปแบบ Octet String ดูตัวอย่างด้านล่าง

สตริงอินพุต: \n\t\f\b\p\k\j\l\mestPrepared

สตริงเอาท์พุท: \\012\\011\\014\\010pkjlmestPrepared

เอาต์พุตสตริงถูกแทรกในฐานข้อมูล ตอนนี้ฉันดึงข้อมูลจากฐานข้อมูลในรหัส java โดยใช้ JDBC ฉันจะ unescape สตริงกลับไปเป็นค่าเดิมได้อย่างไร

ฉันคิดถึงวิธีที่เป็นไปได้สองวิธี

  1. เปลี่ยนเคียวรีการดึงฐานข้อมูลและส่งฟิลด์นี้ไปยังฟังก์ชันการจัดการสตริงของ postgres เช่นซึ่งสามารถแปลงไบต์เป็นข้อความ
  2. ทำการถอดรหัสในโค้ด Java

ฉันเข้าใจว่าวิธีที่ 1 จะมีประสิทธิภาพมากขึ้น ฉันได้ลองฟังก์ชั่นเกือบทั้งหมดที่ระบุไว้ที่นี่แต่ไม่มีอะไรทำงาน กรุณาช่วย!!

ฉันใช้ postgres รุ่น 8.4 บนเครื่อง linux


2
ไดรเวอร์ JDBC ควรจะถอดรหัสไบต์ มีอะไรผิดปกติกับResultSet.getBytes()?
Daniel Vérité

@ DanielVéritéฉันจะลองและแจ้งให้คุณทราบ
Amit

คำตอบ:


8

คุณได้ทดลองencode(data bytea, format text)กับescapeรูปแบบ ในไวยากรณ์formatนั้นสามารถเป็นส่วนใดส่วนหนึ่งของสิ่งเหล่านี้

  • base64
  • แม่มด
  • หนี

ดังนั้นencode(E'123\\000456'::bytea, 'hex')จะส่งออก bytea เป็นเลขฐานสิบหกเข้ารหัส


นี่ควรเป็นข้อคิดเห็นในคำถามเว้นแต่คุณแน่ใจว่าจะแก้ปัญหาได้ หากสามารถแก้ปัญหาได้คุณสามารถอธิบายรายละเอียดเกี่ยวกับสาเหตุและวิธีการนี้เพื่อประโยชน์ของผู้อ่านในอนาคตได้หรือไม่
Max Vernon

@Valgog ฉันได้พยายามแล้วว่า ..
Amit

6

การแปลง BYTEA เป็น TEXT คุณต้องทราบการเข้ารหัสภายในของข้อความ คุณไม่สามารถทำสิ่งใดได้โดยไม่ทราบการเข้ารหัส ในtextคอลัมน์ปกติฐานข้อมูลจะจัดเก็บข้อความตามที่SERVER_ENCODINGตั้งค่าไว้ ยกตัวอย่างเช่นในตัวอย่างของคุณได้รับการแปลเป็น\n \012นั่นคือคุณสมบัติของการเข้ารหัส มันไม่เป็นความจริงสำหรับจักรวาล

ถ้าคุณรู้ว่าการเข้ารหัสมันง่าย แต่ ..

  1. เราใช้สตริงอินพุตของคุณเป็นตัวอักษรที่เข้ารหัส
  2. เราencodeมัน สิ่งนี้สร้างสตริงที่ใช้ Escape (ชนิดtext)
  3. byteaแล้วเราจะต้องถอดรหัสมันกลับไปที่ได้รับประเภทของ
  4. ตอนนี้มีไม่อนุญาตให้เรากลับไปbytea textเราต้องบอกว่ารูปแบบข้อความใดที่byteaใช้งานconvert_fromอยู่ เราบอกว่าเป็น UTF-8

นี่คือตัวอย่าง

SELECT convert_from(decode(x, 'escape'), 'UTF-8')
FROM encode(E'\n\t\f\b\p\k\j\l\mestPrepared'::bytea, 'escape')
  AS t(x);

5

สำหรับผู้ติดตามเนื่องจากนี่เป็นคำถามที่ยอมรับได้สำหรับ "การแปลงไบต์เป็นข้อความ" (นั่นคือเพื่อให้คุณสามารถเห็นได้ใน pgAdmin เป็นต้น) ต่อไปนี้เป็นวิธีการทำให้สามารถดูได้:

select encode(table.your_column_name, 'escape') as some_name from table_name

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.