为什么顶级数据库平台中没有无符号整数类型?


15

数据库通常是非常可定制的,具有不同的数据类型和自定义长度。

当我尝试寻找使用unsigned intPostgreSQL和MS SQL Server都不提供的类型的语法时,这让我感到惊讶。MySQL和Oracle似乎。

在他们看来,这似乎是一个明显的遗漏-下一个最好的perfomant选项是long / bigint(8字节整数),但可能完全不必要!有谁知道为什么他们会选择不包括本地unsigned int支持?


2
便携式==标准要求。C标准未指定普通整数或长整数的宽度,仅指定了可表示数字的最小范围。具有16位整数的平台在某些时候很常见。64位是可能的。36(尽管已灭绝)。24个事件(DSP)。您多久一次拥有适合32位而不是31位的数据,并且已经测量出使用普通数字类型会给您带来性能上的打击?
马太福音

2
SQL-Server和Postgres都NUMERIC(10)允许最大整数9.999.999.999(并且有约束,您不能允许负值。)
ypercubeᵀᴹ2013年

4
由于一个原因:在SQL标准中未指定它们。对于更长时间的讨论有关的Postgres看看这个讨论:postgresql.1045698.n5.nabble.com/...这:postgresql.1045698.n5.nabble.com/...
a_horse_with_no_name


1
@Mat我担心的不是性能下降,而是4个额外的字节x 1.53亿=浪费约612 MB,这些值超过了30亿但不是40亿。除了需要9个字节的存储空间外,numeric(10)的性能也
很高

Answers:


14

微软的吉姆·霍格(Jim Hogg)已通过以下方式对此问题做出了回应:

有优点也有缺点。在专业方面,这似乎是避免某些错误的好方法-必须检查一个(有符号的)int的值>0。而且我还敢冒险说,实际上int的许多用法与计数永远都不应为负数有关。关于将最大行数加倍的问题?-是的,但是我要说的不太吸引人。

从不利方面看,在C或C ++中混合带符号/无符号类型似乎很简单。不是。它打开了一个难以发现的错误的小麻烦-大部分是由于隐含的促销/扩大规则很复杂。遗憾的是,SQL已经具有一组更为复杂的隐式转换规则。我担心,添加无符号整数会使我们所有人更加困惑。

我将这个建议保留在书上。但是,在我们可能/应该添加的所有功能中,就这一方面而言,该功能不在该列表的顶部。

资料来源:Microsoft Connect

我会在专家列表中添加很多内容,并重申他们的SQL引擎已经在做FAR了,比这还复杂的事情,因此他们的团队可以处理增加的复杂性。尽管我不同意它们的总和,但这就是为什么SQL Server不支持unsigned type的原因

Connect链接最初由Martin Smith在问题评论中发布。


3
“使我们更加困惑”-可能是指使用SQL Server的每个人,而不仅仅是他们自己的开发团队。
奥斯卡·伯格伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.