在SQL Server中存储一个非常大的数字

bho*_*ole 6 c# sql biginteger sql-server-2008

如何92233720368547758079223372036854775807922337203699在SQL Server 2008中存储大量数据?Max bigint允许的是9223372036854775807

我想我可以采取的一种方法是执行以下操作,将数字存储为varchar(50)C#代码我可以做的

BigInteger x = BigInteger.Parse("922337203685477580792233720368547758079223372036");
Run Code Online (Sandbox Code Playgroud)

非常感谢任何反馈.谢谢

Ant*_*ram 14

在这种情况下问自己的一个相关问题,以及我在评论中问你的问题如下:

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

你回答了

根据我的理解,该号码是从某个政府机构的Oracle系统发出的唯一标识符,它的长度可以是0到50,我们需要将它存储在我们的应用程序中

这应该会引导您找到与尝试将数据存储为数字不同的答案.

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

  • +1绝对同意,并提出好问题. (3认同)

lc.*_*lc. 5

根据您的评论,如果您不对其进行任何算术运算(即,它只是一个标识符),则它不必一定是-也许根本就不应该是-一个数字。只是把它作为一个字符串两个数据库和消费应用程序,然后继续前进。


但是,对于将来有实际数字的访客,我可以想到两种选择:

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

进行二进制路由可能会带来性能或空间上的好处,但也可能会限制需要使用该值的其他应用程序。恕我直言,不过,除非您每秒要解析其中的许多内容,否则我怀疑这是否真的值得麻烦-而且这些天的存储价格便宜。

此外,如今,字符串似乎已成为事实上的序列化方法(例如XML或JSON),并且存储在中varchar也将使您可以立即使用SQL Server的XML功能。

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


And*_*mar -1

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

  • 问题中的数字> 38 位。 (5认同)