Sử dụng PostgreQuery 8.4, làm thế nào để chuyển đổi bytea thành giá trị văn bản trong postgres?


15

Trong ứng dụng của mình, tôi chèn dữ liệu vào cơ sở dữ liệu bằng mã C, vì các chuỗi tôi nhận được từ một nguồn không đáng tin cậy, tôi đã thoát chúng bằng PQescapeByteaConnthư viện libpq. Mà đang hoạt động hoàn toàn tốt tức là kết quả trong chuỗi định dạng Octet. Xem ví dụ dưới đây,

Chuỗi đầu vào : \n\t\f\b\p\k\j\l\mestPrepared

Chuỗi đầu ra: \\012\\011\\014\\010pkjlmestPrepared

Chuỗi đầu ra được chèn vào cơ sở dữ liệu. Bây giờ tôi lấy dữ liệu đó từ cơ sở dữ liệu trong mã java bằng cách sử dụng JDBC. Làm thế nào tôi có thể hủy bỏ chuỗi trở lại giá trị ban đầu của nó?

Tôi nghĩ về hai cách tiếp cận có thể,

  1. Thay đổi truy vấn truy xuất cơ sở dữ liệu và chuyển trường này sang bất kỳ chức năng thao tác Chuỗi nào của postgres tức là có thể chuyển đổi bytea thành văn bản.
  2. Thực hiện giải mã bằng mã Java.

Tôi có thể hiểu rằng cách tiếp cận 1 sẽ hiệu quả hơn. Tôi đã thử hầu hết tất cả các chức năng được liệt kê ở đây nhưng không có gì hoạt động. Xin vui lòng giúp đỡ!!

Tôi đang sử dụng phiên bản 8.4 của postgres trên máy linux.


2
Trình điều khiển JDBC có nhiệm vụ giải mã bytea. Có chuyện gì với bạn ResultSet.getBytes()vậy?
Daniel Vérité

@ DanielVérité Tôi sẽ thử điều đó và cho bạn biết về điều đó
Amit

Câu trả lời:


8

Bạn đã thử encode(data bytea, format text)với escapeđịnh dạng. Trong cú pháp đó formatcó thể là bất kỳ trong số này,

  • cơ sở64
  • lục giác
  • bỏ trốn

Vì vậy, encode(E'123\\000456'::bytea, 'hex')sẽ xuất ra bytea dưới dạng mã hóa hex.


Đây phải là một nhận xét về câu hỏi, trừ khi bạn chắc chắn rằng nó giải quyết vấn đề. Nếu nó giải quyết được vấn đề, bạn có thể giải thích lý do tại sao và làm thế nào điều này hoạt động vì lợi ích của độc giả tương lai?
Max Vernon

@Vacheog Tôi đã thử rồi ..
Amit

6

Chuyển đổi BYTEA sang văn bản đòi hỏi bạn phải biết mã hóa nội bộ của văn bản. Không biết mã hóa, bạn không thể làm gì được. Trong một textcột bình thường , cơ sở dữ liệu lưu trữ văn bản dưới dạng bất cứ thứ gì SERVER_ENCODINGđược đặt là. Ví dụ, trong ví dụ của bạn \nđược dịch sang \012. Vâng, đó là một tài sản của mã hóa. Nó không khách quan đúng với vũ trụ.

Nếu bạn biết mã hóa, tuy nhiên nó đơn giản ..

  1. Chúng tôi lấy chuỗi đầu vào của bạn dưới dạng một chữ được mã hóa.
  2. Chúng tôi encodenó. Điều này tạo ra một chuỗi thoát (loại text).
  3. Sau đó, chúng ta phải giải mã nó để có được một loại bytea.
  4. Bây giờ có một byteakhông cho phép chúng tôi quay trở lại text. Chúng ta phải nói với nó định dạng văn bản byteađang sử dụng convert_from. Chúng tôi nói với nó UTF-8.

Đây là một ví dụ.

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);

4

Đối với những người theo dõi, vì đây dường như là câu hỏi kinh điển cho "chuyển đổi bytea thành văn bản" (nghĩa là bạn thực sự có thể nhìn thấy nó trong pgAdmin, v.v.). Đây là cách để có thể xem được:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.