"char"
Это однобайтовый тип в PostgreSQL, который соответствует диапазону -1212127.Начиная с документов,
Тип "char"
(обратите внимание на кавычки) отличается от char(1)
тем, что использует только один байт памяти. Он используется внутри системных каталогов как упрощенный тип перечисления.
Вы можете сместить это в сторону [-128,127], вычтя 128 из любого входа в диапазоне [0-255] передвы записываете в базу данных и добавляете ее обратно в вывод при чтении из базы.
-- works
SELECT (-128)::"char", 127::"char";
-- generates out of range
SELECT (-128)::"char";
SELECT 128::"char";
-- Shifts to unsigned range.
-- If you're going to be using "char"
-- review the results of this query!
SELECT
x::int AS "inputUnsigned",
chr(x) AS "extendedASCII",
-- this is the "char" types representation for that input.
signed::"char" AS "charRepresentation",
signed AS "inputUnsignedToSigned",
signed+128 AS "inputUnsignedToSignedToUnsigned"
FROM generate_series(1,255) AS gs(x)
-- Here we map the input in the range of [0,255] to [-128,127]
CROSS JOIN LATERAL ( VALUES (x::int-128) )
AS v(signed);
Небольшая выдержка из вывода
inputUnsigned | extendedASCII | charRepresentation | inputUnsignedToSigned | inputUnsignedToSignedToUnsigned
---------------+---------------+--------------------+-----------------------+---------------------------------
....
190 | ¾ | > | 62 | 190
191 | ¿ | ? | 63 | 191
192 | À | @ | 64 | 192
193 | Á | A | 65 | 193
194 | Â | B | 66 | 194
195 | Ã | C | 67 | 195
196 | Ä | D | 68 | 196
...
Мы используем generate_series(1,255)
только потому, что chr(0)
выбрасывает, потому что вы не можете сгенерировать или вывести ASCII NUL
(PostgreSQL использует cstrings)
pguint
Extension
Pguint является расширением, которое обеспечивает два однобайтовых представления,
int1
(со знаком) uint1
(без знака)