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

4ioopgfo  于 2023-01-29  发布在  SQL Server
关注(0)|答案(8)|浏览(289)

我特别考虑的是无符号的int
下面是一个实际的例子:当你的标识列达到最大值时,你该怎么办?你可以选择BigInt(8字节存储空间,而不是4字节),或者重构应用程序以支持负整数,甚至可以创建你自己的规则,如这个答案所示;这两种选择都不是最佳的。
UInt将是一个理想的解决方案,但SQL Server不提供(MySQL提供)。
我知道无符号数据类型不是SQL标准(SQL-2003)的一部分,但对我来说仍然是一种浪费。
不包括这些(在SQL Server或标准中)的原因是什么?

chhkpiq4

chhkpiq41#

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

Identity(-2147483648, 1)
eimct9ow

eimct9ow2#

如果要我猜的话,我会说他们是在试图避免类型的激增,一般来说,没有什么是无符号整数可以做的,而有符号整数不能做的。至于需要介于2147483648和4294967296之间的数字的情况,您可能应该使用8字节整数,因为该数字最终也会超过4294967296.

jxct1oxe

jxct1oxe3#

我发现了一个类似的问题on Microsoft Office Dev Center.
Jim Hogg(程序经理)的回复对添加unsigned int有一些赞成和反对的意见。主要的反对意见是实现隐式类型转换的规则变成了一场噩梦。
请求已关闭,因为“无法修复”。

jljoyd4f

jljoyd4f4#

它们不支持SIGNED和UNSIGNED关键字,因为它们不是标准的。在SQL标准中,所有数值类型都是带符号的。
UNSIGNED(和SIGNED,默认值)是MySQL扩展,用于在相同的字节数中存储更高的无符号数字,并且不允许负数。

c86crjj0

c86crjj05#

以32位(8字节)int为例,32位int的取值范围为-2^31 ~2^31 -1,需要31位来记录你赋值的值,只需要1位来记录值的符号。
所以你的问题的答案是“没必要”。即使你赋给的每个值都是正的,但每个值只浪费1位。创建一个新的数据类型只为每个值节省1位,这并不是优化存储空间的好方法。

laik7k3q

laik7k3q6#

将数据库设置为具有最小标识标识(-2147483648,1)
然后,在加载到.net UInt 64变量时,将2147483648添加到该变量。然后,-2147483648变为0 -1000000000变为1147483648

  • 但在大多数情况下,内部密钥不应向客户端公开,我通常使用一个单独的密钥,可以是类似于“ABCKey 1”的任何内容

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

6za6bjd0

6za6bjd07#

在某些情况下,SQL Server中需要无符号数字。例如,可能需要将二进制值的等效值存储为整数。在这种情况下,对于32位二进制值,需要使用64位bigint而不是32位int数据类型。

epfja78i

epfja78i8#

你可以一直使用DECIMAL。巨大的小数-DECIMAL(38, 0)。应该足够一两个月了。。

CREATE TABLE IdentityTest
(
    Id DECIMAL(38, 0) IDENTITY,
    Name NVARCHAR(200)
)

INSERT INTO IdentityTest VALUES('John'),('Peter'),('Tom')

SELECT * FROM IdentityTest

DROP TABLE IdentityTest

这会产生以下结果:
| 身份证|姓名|
| - ------|- ------|
| 1个|约翰|
| 第二章|彼得|
| 三个|汤姆|

相关问题