我特意想到未签名的int
。
以下是一个实际示例:当您的标识列最大化时,您会怎么做?可以转到BigInt
(8个字节的存储而不是4个)或者重构应用程序以支持负整数,甚至可以创建自己的规则,如this answer所示;这两种选择都不是最佳选择。
UInt
将是一个理想的解决方案,但SQL Server不提供它(MySQL所在的地方)。
我知道无符号数据类型不是SQL标准(SQL-2003)的一部分,但对我来说似乎仍然是一种浪费。
不包括这些内容的原因是什么(在SQL Server或标准中)?
答案 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
然而,我同意在 99% 的系统中数据类型足够大。如果你真的需要更多,你可以使用 GUID - 但是这对于 Index 来说很糟糕,除非你使用下一个连续的 GUID。