Разговор о ДОМЕНАХ интересен, но не имеет отношения к единственно возможному происхождению этого вопроса. Стремление к беззнаковым целым числам состоит в том, чтобы удвоить диапазон целых чисел с тем же количеством битов, это аргумент эффективности, а не желание исключить отрицательные числа, все знают, как добавить контрольное ограничение.
Когда кто-то спросил об этом, Том Лейн заявил:
По сути, вероятность того, что это произойдет, равна нулю, если только вы не найдете способ вписать их в числовую иерархию продвижения, которая не нарушила бы многие существующие приложения. Мы смотрели на это не раз, если память не изменяет, и не смогли придумать работоспособный дизайн, который, казалось бы, не нарушал POLA.
Что такое "ПОЛА"? Google дал мне 10 бессмысленных результатов. Не уверен, что это неполиткорректная мысль и поэтому подвергнута цензуре. Почему этот поисковый запрос не дал никакого результата? Что бы ни.
Вы можете реализовать беззнаковые целые как типы расширения без особых проблем. Если вы сделаете это с помощью C-функций, то вообще не будет проигрыша в производительности. Вам не нужно расширять синтаксический анализатор для работы с литералами, потому что PgSQL имеет такой простой способ интерпретировать строки как литералы, просто напишите '4294966272'::uint4 в качестве ваших литералов. Актеры тоже не должны быть большой проблемой. Вам даже не нужно делать исключения диапазона, вы можете просто рассматривать семантику '4294966273'::uint4::int как -1024. Или можешь выкинуть ошибку.
Если бы я хотел этого, я бы сделал это. Но поскольку я использую Java по другую сторону SQL, для меня это не имеет большого значения, поскольку в Java также нет этих целых чисел без знака. Так что я ничего не выигрываю. Меня уже раздражает, если я получаю BigInteger из столбца bigint, когда он должен вписываться в long.
Другое дело, если бы мне нужно было хранить 32-битные или 64-битные типы, я мог бы использовать PostgreSQL int4 или int8 соответственно, просто помня, что естественный порядок или арифметика не будут работать надежно. Но на хранение и извлечение это не влияет.
Вот как я могу реализовать простой беззнаковый int8:
Сначала я буду использовать
CREATE TYPE name (
INPUT = uint8_in,
OUTPUT = uint8_out
[, RECEIVE = uint8_receive ]
[, SEND = uint8_send ]
[, ANALYZE = uint8_analyze ]
, INTERNALLENGTH = 8
, PASSEDBYVALUE ]
, ALIGNMENT = 8
, STORAGE = plain
, CATEGORY = N
, PREFERRED = false
, DEFAULT = null
)
минимальные 2 функции uint8_in
и uint8_out
я должен сначала определить.
CREATE FUNCTION uint8_in(cstring)
RETURNS uint8
AS 'uint8_funcs'
LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION uint64_out(complex)
RETURNS cstring
AS 'uint8_funcs'
LANGUAGE C IMMUTABLE STRICT;
необходимо реализовать это в C uint8_funcs.c. Поэтому я воспользуюсь сложным примером отсюда и упрощу его:
PG_FUNCTION_INFO_V1(complex_in);
Datum complex_in(PG_FUNCTION_ARGS) {
char *str = PG_GETARG_CSTRING(0);
uint64_t result;
if(sscanf(str, "%llx" , &result) != 1)
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("invalid input syntax for uint8: \"%s\"", str)));
return (Datum)SET_8_BYTES(result);
}
ну ладно, или вы можете просто найти, что это уже сделано.
person
Gunther Schadow
schedule
18.01.2020
serial
(от 1 до 2 147483647) илиbigserial
(от 1 до 9 223372036854775807). 64-битное целое число со знаком, вероятно, предлагает более чем достаточно места. - person mu is too short   schedule 28.12.2013