如何在SQL Server 2008中存储大量数字92233720368547758079223372036854775807922337203699
?最高bigint
允许为9223372036854775807
我想我可以采取的一种方法是执行以下操作,将数字存储为varchar(50)
,并且在C#代码中我可以做的是
BigInteger x = BigInteger.Parse("922337203685477580792233720368547758079223372036");
非常感谢任何反馈。感谢
答案 0 :(得分:14)
在这种情况下问自己的一个相关问题,以及我在评论中问你的问题如下:
你真的很大的数字是用作算术的数字,还是只是一些标识符?
你回答了
根据我的理解,这个号码是从某个政府机构的Oracle系统发出的唯一标识符,它的长度可以是0到50,我们需要将它存储在我们的应用程序中
这应该会引导您找到与尝试将数据存储为数字不同的答案。
如果它只是一个标识符,那么您实际上不需要将其存储或视为数字。从数据的角度来看,由数字组成的字符串,例如美国的社会安全号码或信用卡和贷款的帐号,实际上不是数字。它们是标识符字符串。以这种方式存储它们。
答案 1 :(得分:5)
从你的评论中,如果你没有对它做任何算术(即它只是一个标识符),它不一定是 - 而且可能根本就不应该 - 是一个数字。只需将其视为两者数据库和消费应用程序中的字符串,然后继续。
但是,对于问题的未来访问者谁实际拥有号,我可以想到两个选项:
varchar
和BigInteger.Parse(string)
/ BigInteger.ToString()
varbinary
和BigInteger..ctor(byte[])
/ BigInteger.ToByteArray()
在执行二进制路由时可能会有性能或空间优势,但它也可能会限制需要使用该值的其他应用程序。恕我直言,除非你每秒钟要解析其中的许多内容,否则我怀疑它真的值得麻烦 - 这些天存储很便宜。
此外,字符串似乎是事实上的序列化方法(例如XML或JSON),并且存储在varchar
中也将允许您直接利用SQL Server的XML功能开箱即用。
第三个选项是专门创建一个CLR类型来包装BigInteger
,因此您可以直接在SQL Server中使用它(即用于比较和算术)。再说一次,不确定是否值得麻烦。
答案 2 :(得分:1)
将数字存储为字符串的方法是最安全的方法。 SQL不是为处理无限精度数而设计的。例如,DECIMAL的大小仅限于几十位有效数字。
另一种方法是将数字存储为varbinar()
(如果您知道最大尺寸,则为binary()
)。这样可行,但您将以应用程序使用的格式存储数字,而不是数据库。这可能会限制应用程序的可移植性。
答案 3 :(得分:0)
考虑使用decimal
数据类型。它最多可存储38位数字。