PostgreSQL에 1 바이트 정수를 저장하는 방법은 무엇입니까?


14

PostgreSQL 문서에서 정수 데이터 유형 은 2 바이트, 4 바이트 또는 8 바이트 공간에 저장할 수 있다고합니다. 데이터베이스의 테이블 열 중 하나에 1 바이트 정수 값이 포함되어 있으며 1 바이트 데이터 유형으로 저장하고 싶습니다.

  1. PostgreSQL에서 1 바이트 정수 데이터 유형을 사용하는 확장 기능이나 방법이 있습니까?
  2. NUMERIC (1,0)은 몇 바이트입니까?

답변:


16

아니요 , Postgres 표준 배포판에는 1 바이트 정수가 없습니다. 표준 Postgres의 모든 내장 숫자 유형은 2 바이트 이상을 차지합니다.

확장 펭귄

그러나 그래 , Postgres의 핵심 개발자 중 하나 인 Peter Eisentraut가 관리 하는 확장 pguint가 있습니다. 표준 배포판의 일부가 아닙니다.

다양한 부호없는 정수 유형 외에도 찾고있는 1 바이트 정수를 제공합니다.

int1 (signed 8-bit integer)
uint1 (unsigned 8-bit integer)
uint2 (unsigned 16-bit integer)
uint4 (unsigned 32-bit integer)
uint8 (unsigned 64-bit integer)

가능한 합병증을 설명하는 링크 된 사이트에서 "토론"장을 읽으십시오. 더 많은 정수 유형을 도입 할 때는 유형 캐스트 ​​및 숫자 리터럴에주의를 기울여야합니다 ...

해결 방법

가능한 간단한 해결 방법은 1 바이트 정수 값을 "char""내부"단순한 1 문자 유형 으로 인코딩하는 것 입니다. 실제로는 단일 바이트 스토리지 , 부호있는 1 바이트 정수의 바이트 값, 상위 절반은 ASCII 문자

-128 ~ 127 범위의 값을 인코딩 할 수 있습니다 . 데모:

SELECT i
     , i::"char"
     , i::"char"::int
FROM   generate_series(-128,127) i;

표시 할 수없는 문자가 여러 개 있습니다. 따라서 표시하기 전에 저장하고 디코딩 하기 전에 인코딩하십시오 ...

기억하십시오 : "char"간단하고 저렴한 열거를위한 "내부"유형입니다. 공식적으로 설계되지 않았으며 다른 RDBMS로 이식 할 수 없습니다. 이에 대한 Postgres 프로젝트의 보증은 없습니다.

필자의 초기 제안은 부호없는 1 바이트 정수 (0-255)의 범위를 다루고 text디딤돌로 사용할 수 있다는 가정에 근거하여 부주의하게 제안되었습니다 . 에반은 내 길의 오류를 지적했다 : 그것은 1에서 127까지만 작동하고 나머지는 실패합니다. 대신, 캐스트 사이에 127 정수 범위를 -128 사용 "char"하고 integer두 문제를 해결하기 위해 직접.

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