Лучший тип данных для хранения денежных значений в MySQL


Я хочу хранить много записей в базе данных MySQL. Все они содержат денежные величины. Но я не знаю, сколько цифр будет вставлено для каждого из них.
Какой тип данных я должен использовать для этой цели?
тип varchar или INT (или другие числовые типы данных)?

10 227

10 ответов:

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

decimal(15,2)
  • 15 это точность (общая длина значения, включая десятичные знаки)
  • 2 - это количество цифр после запятой

посмотреть Числовые Типы MySQL:

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

можно использовать DECIMAL или NUMERIC так же

десятичные и числовые типы хранят точные числовые значения данных. Эти типы используются, когда важно сохранить точную точность, например, с денежными данными. В MySQL, числовые реализуется в виде десятичной, поэтому следующие замечания о десятичной в равной степени применяются к числовым. :MySQL

т. е.DECIMAL(10,2)

Example settings

читать

Это зависит от ваших потребностей.

используя DECIMAL(10,2) обычно достаточно, но если вам нужно немного более точные значения можно установить DECIMAL(10,4).

если вы работаете с большими значениями заменить 10 С 19.

Я предпочитаю использовать BIGINT, и хранить значения в умножить на 100, так что он станет целым числом.

например, для представления значения валюты 93.49, значение должно храниться как 9349, при отображении значения мы можем делим на 100 и дисплей. Это займет меньше места для хранения.

внимание:
В основном мы не делаем currency * currency умножение, в случае если мы делаем это затем разделите результат на 100 и сохраните, чтобы он вернулся к правильной точности.

Если ваше приложение должно обрабатывать денежные значения до триллиона, то это должно работать: 13,2 Если вам необходимо соблюдать GAAP (общепринятые принципы бухгалтерского учета), то используйте: 13,4

обычно вы должны суммировать свои денежные значения в 13,4 перед округлением вывода до 13,2.

действительно, это зависит от предпочтений программиста. Я лично использую: numeric(15,4) соответствуют Общепринятые Принципы Бухгалтерского Учета ( GAAP).

попробуйте использовать

Decimal(19,4)

это обычно работает с любой другой БД, а также

В то время, когда этот вопрос был задан, никто не думал о Bitcoin цене. В случае с БТД, то, вероятно, недостаточно, чтобы использовать DECIMAL(15,2). Если биткоин подорожает до $ 100 000 и более, то нам понадобится как минимум DECIMAL(18,9) для поддержки криптовалют в наших приложениях.

DECIMAL(18,9) занимает 12 байт пространства в MySQL (4 байта на 9 цифр).

мы используем:double.

*вздох*

почему?

потому что он может представлять любое 15-значное число без ограничений на то, где десятичная точка. Все за жалкие 8 байт!

таким образом, он может представлять:

  • 0.123456789012345
  • 123456789012345.0

...и все, что между ними.

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

один double поле может представлять 999,999,999,999,999 s в японских иенах, 9,999,999,999,999. 99 s в долларах США и даже 9,999,999. 99999999 s в биткойнах

если вы попробуете сделать то же самое с decimal необходимо decimal(30, 15), который стоит 14 байт.

предостережения

конечно, с помощью double не без предостережений.

, это не потеря точности, как некоторые склонны указывать. Даже если double сам по себе не может быть внутренне точно к основанию 10, мы можем сделать его точно как округление значение мы вытаскиваем из базы данных ее значительные десятичные разряды. Если это необходимо. (например, если он будет выведен, и требуется представление базы 10.)

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

  1. выполнение сравнения на нем.
  2. запись его обратно в базу данных.

еще один вид предостережения, в отличие от decimal(m, d) где база данных будет препятствовать программам вставлять число с более чем m цифры, такие проверки не существует с double. Программа может вставить введенное пользователем значение из 20 цифр, и он будет в конечном итоге молча записывается как неточная сумма.

умножает 10000 и хранит как BIGINT, как "валюта" в Visual Basic и Office. См.https://msdn.microsoft.com/en-us/library/office/gg264338.aspx