PostgreSQL 8.4를 사용하여 bytea를 postgres의 텍스트 값으로 변환하는 방법은 무엇입니까?


15

내 응용 프로그램에서 C 코드를 사용하여 데이터베이스에 데이터를 삽입합니다. 신뢰할 수없는 소스에서받은 문자열 때문에 PQescapeByteaConnlibpq 라이브러리를 사용하여 이스케이프 처리했습니다 . 완벽하게 작동하는 즉, Octet 형식 String이됩니다. 아래 예를 참조하십시오.

입력 문자열 : \n\t\f\b\p\k\j\l\mestPrepared

출력 문자열 : \\012\\011\\014\\010pkjlmestPrepared

출력 문자열이 데이터베이스에 삽입됩니다. 이제 JDBC를 사용하여 Java 코드로 데이터베이스에서 해당 데이터를 검색합니다. 문자열을 원래 값으로 되돌릴 수있는 방법은 무엇입니까?

두 가지 가능한 접근 방식을 생각했습니다.

  1. 데이터베이스 검색 조회를 변경하고이 필드를 postgres의 문자열 조작 함수 (예 : bytea를 텍스트로 변환 할 수있는)로 전달하십시오.
  2. Java 코드로 디코딩을 수행하십시오.

접근법 1이 더 효율적이라는 것을 이해할 수 있습니다. 여기에 나열된 거의 모든 기능을 시도 했지만 아무것도 작동하지 않습니다. 도와주세요!!

Linux 컴퓨터에서 postgres 버전 8.4를 사용하고 있습니다.


2
JDBC 드라이버는 bytea를 디코딩해야합니다. 무슨 일이야 ResultSet.getBytes()?
Daniel Vérité

@ DanielVérité 나는 그것을 시도하고 그것에 대해 알려드립니다
Amit

답변:


8

encode(data bytea, format text)with escape형식 을 사용해 보셨습니까? 이 구문 format에서 다음 중 하나 일 수 있습니다.

  • base64
  • 마녀
  • 탈출

따라서 encode(E'123\\000456'::bytea, 'hex')bytea를 16 진수로 출력합니다.


문제가 해결되지 않았다면 질문에 대한 의견이어야합니다. 문제가 해결되면 미래 독자에게 도움이되는 이유와 방법에 대해 자세히 설명해 주시겠습니까?
Max Vernon

@Valgog 나는 이미 그것을 시도했다 ..
Amit

6

BYTEA를 TEXT로 변환하려면 텍스트의 내부 인코딩을 알아야합니다. 인코딩을 모르면 할 수있는 일이 없습니다. 일반 text열에서 데이터베이스 SERVER_ENCODING는 설정된대로 텍스트를 저장합니다 . 예를 들어, 예제 \n에서로 번역됩니다 \012. 그것은 인코딩의 속성입니다. 우주에는 객관적으로 사실이 아닙니다.

인코딩을 알고 있다면 간단합니다 ..

  1. 입력 문자열을 인코딩 된 리터럴로 사용합니다.
  2. 우리는 encode. 이스케이프 된 문자열 (type 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);

4

추종자들에게 이것은 "bytea를 텍스트로 변환"에 대한 정식적인 질문 인 것 같습니다 (즉, 실제로 pgAdmin 등에서 볼 수 있습니다). 보기 만하는 방법은 다음과 같습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.