2013-03-29 76 views
4

我如何在SQL Server 2008中存储大量数据,如92233720368547758079223372036854775807922337203699?最大bigint可以是9223372036854775807在SQL Server中存储一个非常大的数字

我想一个办法,我可以采取的是做以下的号码存储为varchar(50)和C#代码中,我可以做的是

BigInteger x = BigInteger.Parse("922337203685477580792233720368547758079223372036"); 

希望得到任何反馈。谢谢

+2

你真的很大的数字是用来作为算术的数字,还是只是一些标识符? –

+0

从我所了解的情况来看,这个号码是从某个政府机构的Oracle系统作为唯一标识符发布的,它的长度可以长达1-50个,我们需要将其存储在我们的应用程序中。 – bhole

+2

数字类型是在内存中以一种对算术运算有效的方式表示(加法/乘法等)。您的号码只是由十进制数字组成的标识符,并不*代表数字(您将永远不会利用数字表示法),因此您应该将它们存储为字符串。 –

回答

0

考虑使用decimal数据类型。它可以存储多达38位数字。

+2

问题中的数字大于38位数。 –

4

从你的评论中,如果你没有对它进行任何算术运算(即它只是一个标识符),它不必是 - 也许根本不应该是 - 首先是一个数字。只要将它视为中的一个字符串,即数据库和正在使用的应用程序,然后继续。


然而,对于究竟是谁拥有这个问题将来游客,有两个选择,我能想到的:

  • 使用varcharBigInteger.Parse(string)/BigInteger.ToString()
  • 使用varbinaryBigInteger..ctor(byte[])/BigInteger.ToByteArray()

执行二进制路由可能会带来性能或空间利益,但也可能会限制需要使用该值的其他应用程序。恕我直言,不过,除非你打算每秒钟解析很多这些数据,否则我怀疑这确实是值得的麻烦 - 而且这些日子的存储价格很便宜。

此外,串似乎是事实上序列化方法,这些天(如XML或JSON),并在varchar存储也将让您能够利用SQL Server的XML功能开箱的。

第三个选项是专门创建一个CLR类型来包装BigInteger,因此您可以直接在SQL Server中使用它(即用于比较和算术)。再一次,不确定是否值得这个麻烦。

1

将数字存储为字符串的方法是最安全的方法。 SQL不是用来处理无限制的精确数字的。例如,DECIMAL的大小仅限于几十个有效位数。

另一种替代方法是将号码存储为varbinar()(或如果知道最大大小,则为binary())。这是有效的,但你将以应用程序使用的格式存储数字,而不是数据库。这可能会限制应用程序的可移植性。

15

一个与此相关的问题要问自己,在这种情况下,和一个我在评论问你,是这样的:

是您的意思是作为一个数的算术确实大量,还是只是一些标识符?

你回答

从我的理解是,这个数字是从Oracle系统发出的一些政府机构作为一个唯一的标识符,它可以是只要0 - 50长数并且我们需要将其存储在我们的应用程序中

而且这应该引导您尝试将数据存储为数字。

如果它只是一个标识符,那么你真的不需要将其存储或视为数字。由数字组成的字符串,例如美国的社会安全号码或信用卡和贷款上的帐号,从数据的角度来看并不是真的号码。它们是标识符字符串。以这种方式存储它们。

+3

+1绝对同意,并且要求提出一个很好的问题。 –

+0

感谢所有的伟大和非常及时的答案 – bhole

相关问题