2013-03-29 118 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

相關問題