7

92233720368547758079223372036854775807922337203699我将如何像在 SQL Server 2008 中那样存储大量数据?最大bigint允许是9223372036854775807

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

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

任何反馈将不胜感激。谢谢

4

4 回答 4

16

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

您真正的大数字是要用作算术数字,还是只是一些标识符?

你回应了

据我了解,该数字是由某个政府机构的 Oracle 系统作为唯一标识符发出的,它的长度可以是 0 - 50 个数字,我们需要将其存储在我们的应用程序中

与尝试将数据存储为数字相比,这应该会导致您得到不同的答案。

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

于 2013-03-29T17:17:37.457 回答
8

从您的评论来看,如果您没有对其进行任何算术运算(即它只是一个标识符),它不必是 - 并且可能根本不应该是 - 首先是一个数字。只需将其视为数据库和消费应用程序中的字符串然后继续。


但是,对于实际拥有number的问题的未来访问者,我可以想到两种选择:

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

采用二进制路线可能会带来性能或空间优势,但它也可能会限制需要使用该值的其他应用程序。恕我直言,除非您要每秒解析其中的许多内容,否则我怀疑这是否真的值得麻烦——而且这些天存储很便宜。

此外,如今字符串似乎是事实上的序列化方法(例如 XML 或 JSON),并且存储在 avarchar中还可以让您直接使用 SQL Server 的 XML 功能。

但是,使用这些选项,您将需要在数据库之外进行算术和排序。如果这是需要排序/过滤/处理的数据,您可能需要重新考虑策略。(见@MikeB 的评论)

为了解决自然排序顺序问题(您仍然无法进行算术运算),您可以将字符串补零到固定长度。我的建议是使用持久计算列来填充零。如果您持久化列数据,您还可以在其上放置索引;只需确保在进行排序时对填充列进行排序。SQL Fiddle 演示

或者,最后一种选择是专门创建一个 CLR 类型来 wrap BigInteger,因此您可以直接在 SQL Server 中使用它(即用于比较和算术)。同样,不确定是否值得麻烦,但如果您需要批量进行算术运算,这可能是最快的方法。

于 2013-03-29T17:06:58.657 回答
1

您将数字存储为字符串的方法是最安全的方法。SQL 不是为处理无限精度数字而设计的。例如,DECIMAL 的大小仅限于几十个有效数字。

另一种选择是将数字存储为varbinar()(或者binary()如果您知道最大大小)。这可行,但您将以应用程序使用的格式存储数字,而不是数据库。这可能会限制您的应用程序的可移植性。

于 2013-03-29T17:07:30.793 回答
-1

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

于 2013-03-29T17:05:07.920 回答