2013-03-29 4 views
4

Как хранить большое количество, например 92233720368547758079223372036854775807922337203699 в SQL Server 2008? Макс bigint позволяет это 9223372036854775807Сохранение действительно большого количества в SQL Server

Я думаю, один подход, который я мог бы сделать, это сделать следующее, сохранить номер в varchar(50) и в C# код я мог сделать, это

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

Оценил любую обратную связь. Thanks

+2

Является ли ваше действительно большое количество предназначенным для использования в качестве числа для арифметики, или это просто какой-то идентификатор? –

+0

Из того, что я понимаю, число выпущено из системы Oracle из какого-либо правительственного агентства в качестве уникального идентификатора, оно может достигать 1 - 50 номеров в длину, и нам нужно сохранить это в нашем приложении. – bhole

+2

Числовые типы: представленный в памяти таким образом, чтобы эффективно выполнять арифметические операции (добавление/умножение и т. д.). Ваши номера - это всего лишь идентификаторы, состоящие из десятичных цифр, и не * действительно * представляют число (вы никогда не будете использовать числовое представление), поэтому вы должны хранить их как строки. –

ответ

0

Рассмотрите возможность использования типа данных decimal. Он может хранить до 38 цифр.

+2

Число в вопросе> 38 цифр. –

4

Из вашего комментария, если вы не выполняете арифметику (то есть это просто идентификатор), это не обязательно - и, вероятно, просто не должно быть - номер в первую очередь. Просто обработайте его как строку в как базе данных, так и потребляющем приложении, и продолжайте движение.


Однако для будущих посетителей на вопрос, кто на самом деле имеют число, есть два варианта я могу думать:

  • Использование varchar и BigInteger.Parse(string)/BigInteger.ToString()
  • Использование varbinary и BigInteger..ctor(byte[])/BigInteger.ToByteArray()

При переходе на двоичный маршрут может быть преимущество производительности или пространства, но оно также может ограничить другие приложения, которые должны использовать значение. ИМХО, хотя, если вы не будете разбирать многие из них в секунду, я сомневаюсь, что это действительно стоит хлопот - и в наши дни хранение дешево.

Кроме того, строки кажутся де-факто метод сериализации в эти дни (например, XML или JSON), а также хранение в varchar также позволит вам использовать XML в SQL Server имеется прямо из коробки.

Третьим вариантом является создание типа CLR для обертывания BigInteger, поэтому вы можете использовать его непосредственно в SQL Server (то есть для сравнения и арифметики). Опять же, не уверен, что это стоит хлопот.

1

Ваш подход к сохранению номера в виде строки является самым безопасным подходом. SQL не предназначен для обработки неограниченных чисел точности. Например, DECIMAL ограничен размером всего несколько десятков значащих цифр.

Другой вариант - сохранить номер varbinar() (или binary(), если вы знаете максимальный размер). Это работает, но вы будете хранить номер в формате, используемом приложением, а не в базе данных. Это может ограничить переносимость вашего приложения.

15

Здесь уместно поставить вопрос, чтобы спросить себя в такой ситуации, и один я спросил вас в комментариях, заключается в следующем:

Вашего действительно большое количество предназначены для использования в качестве номера для арифметики , или это просто какой-то идентификатор?

И вы ответили

Из того, что я понимаю это, число выдается из системы Oracle из какого-то правительственного учреждения в качестве уникального идентификатора, это может быть до тех пор, как 0 - 50 число в длину и мы должны сохранить это в нашей заявке

И это должно привести к другому вопросу, чем пытаться хранить данные как числовые.

Если это всего лишь идентификатор, то вам действительно не нужно хранить или рассматривать его как числовое. Строки, состоящие из цифр, таких как номера социального страхования в Соединенных Штатах или номера счетов по кредитным картам и кредитам, на самом деле не являются номерами, с точки зрения данных. Это идентификационные строки. Храните их таким образом.

+3

+1 Определенно согласованный вопрос и хороший вопрос. –

+0

Спасибо всем за замечательные и очень быстрые ответы – bhole

Смежные вопросы