C# 在SQL Server中存储大量数据

C# 在SQL Server中存储大量数据,c#,sql,sql-server-2008,biginteger,C#,Sql,Sql Server 2008,Biginteger,如何在SQL Server 2008中存储大量数据,如92233720368547758079223372036854775807922337203699?最大bigint允许为9223372036854775807 我想我可以采取的一种方法是执行以下操作,将数字存储为varchar(50),在C代码中,我可以做的是 BigInteger x = BigInteger.Parse("922337203685477580792233720368547758079223372036"); 如有任何

如何在SQL Server 2008中存储大量数据,如
92233720368547758079223372036854775807922337203699
?最大
bigint
允许为
9223372036854775807

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

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

如有任何反馈,我们将不胜感激。谢谢

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

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


然而,对于未来真正拥有数字的问题访问者,我可以想到两种选择:

  • 使用
    varchar
    biginger.Parse(字符串)
    /
    biginger.ToString()
  • 使用
    varbinary
    biginger..ctor(字节[])
    /
    biginger.ToByteArray()
采用二进制路由可能会带来性能或空间方面的好处,但也可能会限制其他需要使用该值的应用程序。不过,我想,除非你每秒都要解析其中的许多内容,否则我怀疑它是否真的值得这么麻烦——而且现在的存储成本很低

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

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

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


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

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


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

在这种情况下,我要问自己一个相关的问题,也是我在评论中向您提出的一个问题,如下所示:


你的大数字是用来做算术运算的,还是仅仅是一个标识符

你回答了吗


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

这将导致你得到一个不同的答案,而不是试图将数据存储为数字


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

您的大数字真的是要用作算术数字,还是只是某种标识符?据我所知,该数字是由某个政府机构的Oracle系统作为唯一标识符发布的,它的长度可以长达1-50个数字,我们需要将其存储在应用程序中,数字类型以一种高效的方式在内存中表示(加法/乘法等)。您的数字只是由十进制数字组成的标识符,并不真正代表一个数字(您永远不会利用数字表示法),因此您应该将其存储为字符串。问题中的数字大于38位。感谢所有人的出色和非常及时的回答。使用字符串的问题是您不再存储数字。ORDER BY不起作用,因为数据库将按字符串排序,“5”将位于“45”、“455”和“45555”之后。@MikeB这是事实,如果你阅读关于这个问题的评论,这个数字是政府发布的ID号,他们需要保留在手上。我读到这句话的意思是,他们不需要按它排序,也不会因为缺乏(快速)进行自然排序的能力而受到伤害。如果你真的需要对数字进行排序或操作,那么你就有了一个数字,并且可能会将其存储起来——这就是我回答的下半部分。哦,我明白了。我想当你说“谁有一个号码,有两个选择……”时我很困惑,第一个是varchar。