Làm cách nào để lưu trữ số nguyên một byte trong PostgreSQL?


13

Trong tài liệu PostgreQuery, người ta nói rằng các kiểu dữ liệu số nguyên có thể được lưu trữ trong không gian hai, bốn hoặc tám byte. Một trong các cột của bảng trong cơ sở dữ liệu của tôi chứa giá trị số nguyên một byte và tôi muốn nó được lưu trữ trong kiểu dữ liệu một byte.

  1. Có phần mở rộng hoặc cách sử dụng kiểu dữ liệu số nguyên một byte trong PostgreSQL không?
  2. Có bao nhiêu byte là NUMERIC (1,0)?

Câu trả lời:


14

Không , không có số nguyên 1 byte trong phân phối chuẩn của Postgres. Tất cả các loại số tích hợp của Postgres tiêu chuẩn chiếm từ 2 byte trở lên.

Gia hạn

Nhưng vâng , đó là mở rộng pguint , được duy trì bởi Peter Eisentraut, một trong những nhà phát triển cốt lõi Postgres. Đây không phải là một phần của phân phối tiêu chuẩn:

Ngoài các loại số nguyên không dấu khác nhau, nó cũng cung cấp số nguyên 1 byte mà bạn đang tìm kiếm:

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)

Hãy chắc chắn đọc chương "Thảo luận" tại trang web được liên kết, giải thích các biến chứng có thể xảy ra. Bạn cần thực hiện việc chăm sóc với các kiểu phôi và chữ số khi giới thiệu nhiều kiểu số nguyên hơn ...

Cách giải quyết

Một cách giải quyết đơn giản có thể là mã hóa các giá trị số nguyên 1 byte dưới "char"dạng loại 1 ký tự đơn giản "bên trong", thực sự sử dụng một byte lưu trữ , các giá trị byte của số nguyên 1 byte đã ký, nửa trên được biểu thị như Ký tự ASCII.

Bạn có thể mã hóa các giá trị trong phạm vi từ -128 đến 127 . Bản giới thiệu:

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

Có một số ký tự không có nghĩa là để hiển thị. Vì vậy, mã hóa trước khi bạn lưu trữ và giải mã trước khi bạn hiển thị ...

Hãy nhớ rằng: "char"là một loại "nội bộ" dành cho liệt kê đơn giản và rẻ tiền. Không được thiết kế chính thức cho những gì chúng tôi đang làm ở đây và không thể chuyển sang RDBMS khác. Không có đảm bảo của dự án Postgres cho việc này.

Các đề xuất ban đầu của tôi đã bất cẩn dựa trên giả định rằng chúng tôi sẽ bao gồm phạm vi của một số nguyên 1 byte không dấu (0-255) và chúng tôi có thể sử dụng textlàm bước đệm. Evan đã chỉ ra các lỗi theo cách của tôi: chỉ hoạt động cho các số 1 - 127 và thất bại cho phần còn lại. Thay vào đó, sử dụng phạm vi số nguyên -128 đến 127 và truyền giữa "char"integertrực tiếp để khắc phục cả hai vấn đề.

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.