7

92233720368547758079223372036854775807922337203699SQL Server 2008のように大きな数を格納するにはどうすればよいですか? 最大bigint許可は9223372036854775807

私が取ることができる1つのアプローチは、次のことを行うことだと思いますvarchar(50).C#コードで数値を保存すると、

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

フィードバックをいただければ幸いです。ありがとう

4

4 に答える 4

16

この種の状況で自問すべき適切な質問と、私がコメントであなたに尋ねた質問は次のとおりです。

あなたの本当に大きな数は、算術の数として使用されることを意図していますか、それとも単なる識別子ですか?

そしてあなたは答えた

私が理解していることから、番号は政府機関のOracleシステムから一意の識別子として発行され、0〜50の番号の長さにすることができ、それをアプリケーションに保存する必要があります

そして、それはデータを数値として保存しようとするのとは異なる答えにつながるはずです。

それが単なる識別子である場合、それを数値として保存または処理する必要はありません。米国の社会保障番号やクレジット カードやローンの口座番号など、数字で構成される文字列は、データの観点からは実際には数字ではありません。それらは識別子文字列です。そのように保管してください。

于 2013-03-29T17:17:37.457 に答える
8

あなたのコメントから、それに対して算術を行っていない場合(つまり、単なる識別子である場合)、そもそも数値である必要はありません-おそらく単純にすべきではありません-。データベースと消費アプリケーションの両方で文字列として扱い、先に進みます。


ただし、実際に数字を持っている質問への将来の訪問者には、考えられる2つのオプションがあります。

  • varcharおよびBigInteger.Parse(string)/を使用BigInteger.ToString()
  • varbinaryおよびBigInteger..ctor(byte[])/を使用BigInteger.ToByteArray()

バイナリ ルートを使用すると、パフォーマンスやスペースの利点が得られる可能性がありますが、その値を使用する必要がある他のアプリケーションが制限される可能性もあります。私見ですが、毎秒これらの多くを解析するつもりでない限り、本当に手間をかける価値があるとは思えません。また、最近のストレージは安価です。

さらに、最近では文字列がデファクトシリアライゼーション メソッド (XML や JSON など) になっているvarcharようです。

ただし、これらのオプションを使用すると、データベースの外部で算術とソートを行う必要があります。これが並べ替え/フィルター処理/操作が必要なデータである場合は、戦略を再考する必要があるかもしれません。(@MikeB のコメントを参照)

自然な並べ替え順序の問題 (まだ算術演算はできません) を回避するには、文字列をゼロで埋めて固定長にすることができます。私の提案は、永続化された計算列を使用してゼロを埋めることです。列データを永続化する場合は、それにインデックスを付けることもできます。ソートを行うときは、パディングされた列でソートするようにしてください。SQL フィドルのデモ

または、最後のオプションは、特に CLR 型を作成して wrapBigIntegerすることです。これにより、SQL Server で直接使用できます (つまり、比較と演算に使用できます)。繰り返しますが、手間をかける価値があるかどうかはわかりませんが、大量の計算を行う必要がある場合は、これが最速の方法かもしれません.

于 2013-03-29T17:06:58.657 に答える
1

数値を文字列として保存するアプローチが最も安全なアプローチです。SQL は、無制限の精度数を処理するようには設計されていません。たとえば、DECIMAL は、サイズがわずか数十桁に制限されています。

もう1つの方法は、数値をvarbinar()(またはbinary()最大サイズがわかっている場合)として保存することです。これは機能しますが、データベースではなく、アプリケーションで使用される形式で数値を保存します。これにより、アプリケーションの移植性が制限される可能性があります。

于 2013-03-29T17:07:30.793 に答える
-1

decimalデータ型の使用を検討してください。最大 38 桁まで保存できます。

于 2013-03-29T17:05:07.920 に答える