为什么SQL Server不支持无符号数据类型?

时间:2010-12-15 15:57:46

标签: sql sql-server sqldatatypes unsigned-integer

我特意想到未签名的int

以下是一个实际示例:当您的标识列最大化时,您会怎么做?可以转到BigInt(8个字节的存储而不是4个)或者重构应用程序以支持负整数,甚至可以创建自己的规则,如this answer所示;这两种选择都不是最佳选择。

UInt将是一个理想的解决方案,但SQL Server不提供它(MySQL所在的地方)。

我知道无符号数据类型不是SQL标准(SQL-2003)的一部分,但对我来说似乎仍然是一种浪费。

不包括这些内容的原因是什么(在SQL Server或标准中)?

6 个答案:

答案 0 :(得分:53)

如果我不得不猜测,我会说他们正在努力避免各种类型的扩散。一般来说,无符号整数无法执行有符号整数无法执行的任何操作。至于需要2147483648和4294967296之间的数字的情况,您可能应该转到8字节整数,因为该数字最终也将超过4294967296。

答案 1 :(得分:44)

为此,您可以使用-2,147,483,648作为种子值。

Identity(-2147483648, 1)

答案 2 :(得分:36)

我发现了一个类似的问题on Microsoft Connect.

Jim Hogg(项目经理)的回复有一些关于添加unsigned int的专家和骗局。主要的骗局是实现隐式类型转换的规则成为一个正确的噩梦。

请求已关闭为“无法修复”。

答案 3 :(得分:0)

它们不支持SIGNED和UNSIGNED关键字,因为它们不是标准的。在SQL标准中,所有数字类型都是带符号的。

UNSIGNED(和SIGNED,这是默认设置)是MySQL扩展,可用于在相同数量的字节中存储较高的无符号数,并禁止使用负数。

答案 4 :(得分:0)

以 32 位(8 字节)int 为例。 32 位 int 的范围是从 -2^31 到 2^31-1。 记录你分配的值需要31位,记录值的符号只需要1位。

所以你的问题的答案是“不必要的”。即使您分配的每个值都是正数,但每个值只浪费 1 位。为每个值仅保存 1 位而创建新的数据类型并不是优化存储空间的好方法。

答案 5 :(得分:0)

将您的数据库设置为具有最小身份 身份(-2147483648, 1)

然后当加载到您的 .net UInt64 变量中时,向其中添加 2147483648。然后 -2147483648 变为 0 -1000000000 变成 1147483648

  • 但在大多数情况下,内部密钥也不应该暴露给客户端,我通常使用一个单独的密钥,可以是“ABCKey1”之类的东西

然而,我同意在 99% 的系统中数据类型足够大。如果你真的需要更多,你可以使用 GUID - 但是这对于 Index 来说很糟糕,除非你使用下一个连续的 GUID。