我特别考虑的是无符号的int
。
下面是一个实际的例子:当你的标识列达到最大值时,你该怎么办?你可以选择BigInt
(8字节存储空间,而不是4字节),或者重构应用程序以支持负整数,甚至可以创建你自己的规则,如这个答案所示;这两种选择都不是最佳的。UInt
将是一个理想的解决方案,但SQL Server不提供(MySQL提供)。
我知道无符号数据类型不是SQL标准(SQL-2003)的一部分,但对我来说仍然是一种浪费。
不包括这些(在SQL Server或标准中)的原因是什么?
我特别考虑的是无符号的int
。
下面是一个实际的例子:当你的标识列达到最大值时,你该怎么办?你可以选择BigInt
(8字节存储空间,而不是4字节),或者重构应用程序以支持负整数,甚至可以创建你自己的规则,如这个答案所示;这两种选择都不是最佳的。UInt
将是一个理想的解决方案,但SQL Server不提供(MySQL提供)。
我知道无符号数据类型不是SQL标准(SQL-2003)的一部分,但对我来说仍然是一种浪费。
不包括这些(在SQL Server或标准中)的原因是什么?
8条答案
按热度按时间chhkpiq41#
为此,您可以使用-2,147,483,648作为种子值。
eimct9ow2#
如果要我猜的话,我会说他们是在试图避免类型的激增,一般来说,没有什么是无符号整数可以做的,而有符号整数不能做的。至于需要介于2147483648和4294967296之间的数字的情况,您可能应该使用8字节整数,因为该数字最终也会超过4294967296.
jxct1oxe3#
我发现了一个类似的问题on Microsoft Office Dev Center.
Jim Hogg(程序经理)的回复对添加unsigned int有一些赞成和反对的意见。主要的反对意见是实现隐式类型转换的规则变成了一场噩梦。
请求已关闭,因为“无法修复”。
jljoyd4f4#
它们不支持SIGNED和UNSIGNED关键字,因为它们不是标准的。在SQL标准中,所有数值类型都是带符号的。
UNSIGNED(和SIGNED,默认值)是MySQL扩展,用于在相同的字节数中存储更高的无符号数字,并且不允许负数。
c86crjj05#
以32位(8字节)int为例,32位int的取值范围为-2^31 ~2^31 -1,需要31位来记录你赋值的值,只需要1位来记录值的符号。
所以你的问题的答案是“没必要”。即使你赋给的每个值都是正的,但每个值只浪费1位。创建一个新的数据类型只为每个值节省1位,这并不是优化存储空间的好方法。
laik7k3q6#
将数据库设置为具有最小标识标识(-2147483648,1)
然后,在加载到.net UInt 64变量时,将2147483648添加到该变量。然后,-2147483648变为0 -1000000000变为1147483648
然而我同意在99%的系统中数据类型已经足够大了,如果你真的需要更多,你可以使用GUID --但是这对索引来说很糟糕,除非你使用下一个连续的GUID。
6za6bjd07#
在某些情况下,SQL Server中需要无符号数字。例如,可能需要将二进制值的等效值存储为整数。在这种情况下,对于32位二进制值,需要使用64位bigint而不是32位int数据类型。
epfja78i8#
你可以一直使用
DECIMAL
。巨大的小数-DECIMAL(38, 0)
。应该足够一两个月了。。这会产生以下结果:
| 身份证|姓名|
| - ------|- ------|
| 1个|约翰|
| 第二章|彼得|
| 三个|汤姆|