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

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

Комментарии к вопросу (2)
Решение

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

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

См. 1SQL Для Числовых Типов1:

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

Комментарии (5)

Вы можете использовать десятичное число или числовой одинаковы

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

т. е. десятичное(10,2)

Читать

Комментарии (4)

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

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

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

Комментарии (8)

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

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

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

Комментарии (2)

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

Обычно сумма Ваших денег значения в 13,4 до округления на выходе до 13,2.

Комментарии (4)

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

Комментарии (2)

Мы используем двойной.

вздох

Почему?

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

Поэтому он может представлять:

  • 0.123456789012345
  • 123456789012345.0

...и что-нибудь между ними.

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

Один "двойной" поле может представлять 999,999,999,999,999 в японских иенах, 9,999,999,999,999.99 С в долларах США, и даже 9,999,999.99999999 s в биткоины

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

# Предупреждения#

Конечно, с помощью "двойной" Это'т без предупреждения.

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

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

  1. Выполнение сравнений на нем.
  2. Записи в базе данных.

Еще какой нюанс есть, в отличие от десятичное число(м, д), где база данных программы не вводя ряд с более " м " цифр, нет таких проверок существует сдвойной`. Программа может вставить введенное пользователем значение из 20 цифр, и это'll в конечном итоге молча записан как неточные суммы.

Комментарии (2)

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

Decimal(19,4)

это правило работает и с любой другой БД, а также

Комментарии (0)

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

в <код>в десятичной(18,9)</код> занимает 12 байт пространства в MySQL (4 байта на 9 цифр).

Комментарии (3)

Хранение денег как значение типа bigint`, умноженное на 100 или больше причин, чтобы использовать меньше места для хранения нет смысла во всех "нормальных" и ситуациях.

  • Чтобы остаться в соответствие с ОПБУ достаточно для хранения валюты в десятичной(13,4)`
  • Руководство MySQL читает, что он должен 4 байта на 9 разрядов для хранения десятичное число.
  • `Десятичное(13,4) представляет собой 9 цифр + 4 цифры после запятой (десятичных разрядов) => 4 + 2 байта = 6 байт
  • по сравнению с 8 байтов требуется для хранения типа.
Комментарии (0)

При необходимости соответствия ОПБУ или вам нужно 4 знака после запятой:

Десятичной(13, 4) Который поддерживает максимальное значение:

$999,999,999.9999

В противном случае, если 2 знака после запятой достаточно: Типа decimal(13,2)

СРЦ: https://rietta.com/blog/best-data-types-for-currencymoney-in/

Комментарии (0)

10000 умножает и хранит как значение типа bigint, как назальный валюты; в Visual Basic и офиса. См https://msdn.microsoft.com/en-us/library/office/gg264338.aspx

Комментарии (0)