Почему целочисленные типы без знака не доступны на лучших платформах баз данных?

15

Базы данных обычно очень настраиваемы с различными типами данных и произвольной длины.

Меня это удивляет, так как я пытаюсь найти синтаксис для использования unsigned intтипов, которые они недоступны ни в PostgreSQL, ни в MS SQL Server. MySQL и Oracle, кажется.

Это выглядит как явное упущение с их стороны - следующим лучшим вариантом для perfomant является long / bigint (8-байтовое целое число), но он может быть совершенно ненужным! Кто-нибудь знает, почему они решили не включать встроенную поддержку unsigned int?

Ehryk
источник
2
Портативный == стандартный. Стандарт C не определяет ширину обычных целых или длинных, только минимальные диапазоны представимых чисел. В какой-то момент платформы с 16-битными картами были обычным явлением. 64 бит возможно. 36 тоже (правда, вымерли). 24 случается (DSP). Как часто у вас есть данные, которые соответствуют 32-битным, но не 31-разрядным, и что вы измеряли, что использование обычных числовых типов дает вам снижение производительности?
Мат
2
И SQL-Server, и Postgres имеют NUMERIC(10)целые числа вплоть до 9.999.999.999(и с ограничением вы можете запретить отрицательные значения.)
ypercubeᵀᴹ
4
По одной причине: они не указаны в стандарте SQL. Для более продолжительного обсуждения, касающегося Postgres, взгляните на это обсуждение: postgresql.1045698.n5.nabble.com/… и это: postgresql.1045698.n5.nabble.com/…
a_horse_with_no_name
2
Для SQL Server объяснение здесь
Мартин Смит
1
@Mat Меня беспокоит не производительность, а 4 дополнительных байта x 153 миллиона = ~ 612 дополнительных потраченных МБ, значения превышают 3 миллиарда, но не 4 миллиарда. Числовой (10) имеет хиты производительности в дополнение к требованию 9 байт памяти: msdn.microsoft.com/en-us/library/ms187746.aspx
Ehryk

Ответы:

14

Microsoft Джим Хогг ответил на эту проблему следующим:

Есть плюсы и минусы. Для профессионалов это хороший способ избежать некоторых ошибок - необходимость проверки (подписанного) int имеет значение> 0. И я также рискну предположить, что многие применения int на самом деле относятся к числу, которое никогда не должно быть отрицательным в любом случае. , На вопрос удвоения максимального числа строк? - правда, но я бы сказал, что это менее убедительно.

С другой стороны ... смешивание подписанных / неподписанных типов в C или C ++ кажется достаточно простым. Это не. Он открывает небольшой список труднодоступных ошибок - в основном из-за сложных правил для неявных продвижений / расширений. У SQL, увы, уже есть еще более сложный набор правил приведения. Боюсь, что добавление неподписанных целых еще более запутает нас всех.

Я оставлю это предложение в книгах. Но среди всех функций, которые мы могли бы / должны добавить, этот, с уважением, не находится в верхней части этого списка.

Источник: Microsoft Connect

Я бы значительно добавил к списку профессионалов и повторю, что их движок SQL уже выполняет FAR более сложные вещи, чем эти, и поэтому их команда может справиться с дополнительной сложностью. Хотя я не согласен с их суммированием, именно поэтому SQL Server не поддерживает неподписанные типы .

Ссылка Connect была первоначально размещена Мартином Смитом в комментариях к вопросу.

Ehryk
источник
3
«еще больше запутайте нас всех» - вероятно, это касается всех, кто использует SQL Server, а не только своей собственной команды разработчиков.
Оскар Берггрен