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 text
là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"
và integer
trực tiếp để khắc phục cả hai vấn đề.