Какой тип поля SQL Server лучше всего подходит для хранения значений цены?

Мне интересно, какой тип лучше всего подходит для поля цены в SQL Server для структуры, подобной магазину?

смотрим обзор у нас есть типы данных, которые называются деньги, smallmoney, то есть decimal / numeric и наконец float и реальные.

имя, память/диск-использование и диапазоны значений:

  • деньги: 8 байт (значения: -922,337,203,685,477.От 5808 до +922,337,203,685,477.5807)
  • Smallmoney: 4 байта (значения: -214,748.3648 до +214,748.3647)
  • Decimal: 9 [по умолчанию, мин. 5] байт (значения: -10^38 +1 до 10^38 -1 )
  • поплавок: 8 байт (значения: -1.79 E+308 до 1.79 E+308 )
  • Real: 4 байта (значения: -3.40 E+38 до 3.40 E+38 )

действительно ли разумно хранить значения цен в тех типы? Как насчет eg. INT?

  • Int: 4 байта (значения: от -2,147,483,648 до 2,147,483,647)

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

Так почему бы не пойти на int?

int быстрый, его только 4 байта, и вы можете легко сделать десятичные дроби, сохраняя значения в центах вместо долларов, а затем разделить, когда вы представляете значения.

другим подходом было бы использовать smallmoney, который также составляет 4 байта, но для этого потребуется математическая часть процессора для выполнения calc, где As Int-целочисленная мощность... с другой стороны, вам нужно будет разделить каждый результат.

есть ли какая-либо" валюта", связанная проблемы с региональными настройками при использовании полей smallmoney / money? что они тоже будут передавать в C# / .NET ?

какие плюсы/минусы? Перейти на целочисленные цены или smallmoney или некоторые другие?

Что говорит ваш опыт?

7 ответов


если вы абсолютно уверены, что ваши номера всегда будут оставаться в диапазоне smallmoney, используйте это, и вы можете сохранить несколько байтов. В противном случае я бы использовал money. Но помните, в наши дни хранение дешево. Дополнительные 4 байта за 100 млн записей все еще меньше половины ГБ. Однако, как указывает @marc_s, используя smallmoney Если вы можете, это уменьшит объем памяти SQL server.

короче говоря, если вы можете уйти с smallmoney, do. Если вы думаете вы может перейти на МАКС, использовать money.

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

мой аргумент против использования int: зачем изобретать колесо, сохраняя int и потом, не забудьте разделить на 100 (10000), чтобы получить значение и умножить обратно, когда вы идете, чтобы сохранить значение. В моем понимании типы денег используют int или long как базовый тип хранения в любом случае.

что касается соответствующего типа данных в .NET, это будет decimal (что также позволит избежать округления в коде C#).


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

многие преимущества денег ... тип данных!


ИСПОЛЬЗУЙТЕ ЧИСЛОВОЙ / ДЕСЯТИЧНЫЙ. Избегайте денег / SMALLMONEY. вот пример того, почему. Рано или поздно типы MONEY / SMALLMONEY, вероятно, подведут вас из-за ошибок округления. Типы денег полностью избыточны и не достигают ничего полезного - сумма валюты является просто еще одним десятичным числом, как и любое другое.

наконец, типы MONEY / SMALLMONEY являются собственностью Microsoft. Числовые / десятичные являются частью стандарта SQL. Они используются, признаются и поняты большим количеством людей и поддерживаются большинством DBMSs и другим программным обеспечением.


лично я бы использовал smallmoney или деньги для хранения магазинных цен.

использование int добавляет сложность в другом месте.

и 200 миллионов совершенно действительная цена в корейских вон или индонезийских рупиях тоже...


типы данных SQL money и smallmoney оба разрешают c# decimal тип:

http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqlmoney(v=VS.71).aspx

поэтому я думаю, что вы могли бы также пойти на decimal. Лично я использую double всю свою жизнь работаю в финансовой отрасли и не испытывал проблем с производительностью и т. д. На самом деле, я нашел это для определенных расчетов и т. д., наличие большего типа данных позволяет более высокая степень точности.


Я бы пошел за типом данных Money. Invididually вы не можете превышать значение в Smallmoney, но было бы легко для нескольких элементов, чтобы превысить его.


в моем приложении ломбарда, операторы ломбарда кредитовать от $5.00 до $10,000.00 Когда они вычисляют сумму кредита, они округляют ее до ближайшего доллара, чтобы избегайте работы с центами (то же самое относится к процентным платежам). Когда сумма кредита превышает $50,00, они округляют ее до ближайших $5,00 (т. е. $50, $55, $60 ...), опять же, чтобы свести к минимуму исчерпание долларовых купюр. Поэтому я использую DECIMAL (7,2) для транзакции.calculated_loan_amount и DECIMAL (5,0) для торговая операция.сумма кредита. Приложение вычисляет сумму кредита до копейки и помещает эту сумму в loan_amount, где она округляется до ближайшего доллара, когда ниже $50 или до ближайшего $5.00, когда больше.