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

StackOverflow https://stackoverflow.com/questions/628637

  •  06-07-2019
  •  | 
  •  

Вопрос

Какой тип данных SQL лучше всего подходит для денежных значений?Я использую MySQL, но предпочел бы тип, независимый от базы данных.

Это было полезно?

Решение

Что-то вроде Decimal (19,4) обычно работает довольно хорошо в большинстве случаев. Вы можете настроить масштаб и точность в соответствии с потребностями чисел, которые вам нужно хранить. Даже в SQL Server я не использую money " как это нестандартно.

Другие советы

Единственное, на что вам следует обратить внимание - если вы переходите с одной базы данных на другую, вы можете обнаружить, что DECIMAL (19,4) и DECIMAL (19,4) означают разные вещи

( http: //dev.mysql .com / doc / refman / 5.1 / en / precision-math-decimal-changes.html )

    DBASE: 10,5 (10 integer, 5 decimal)
    MYSQL: 15,5 (15 digits, 10 integer (15-5), 5 decimal)

Также важно определить, сколько десятичных знаков может потребоваться для ваших расчетов.

Я работал над заявкой на цену акции, которая требовала расчета цены одного миллиона акций. Указанная цена акции должна быть сохранена с точностью до 7 цифр.

Ответ Ассафа о

  

Зависит от того, сколько денег вы получили ...

звучит легкомысленно, но на самом деле это уместно.

Только сегодня у нас возникла проблема, из-за которой не удалось вставить запись в нашу таблицу тарифов, поскольку для одного из столбцов (GrossRate) было установлено значение Десятичное число (11,4), а наш отдел продуктов только что получил контракт на помещения в какой-то удивительный курорт на Бора-Бора, который продается за несколько миллионов тихоокеанских франков за ночь ... то, что никогда не придавало значения при разработке схемы базы данных 10 лет назад.

Для бухгалтерских приложений очень часто хранить значения в виде целых чисел (некоторые даже доходят до того, что говорят, что это only ). Чтобы получить представление, возьмите сумму транзакций (предположим, $ 100,23) и умножьте ее на 100, 1000, 10000 и т. Д., Чтобы получить необходимую точность. Так что если вам нужно только хранить центы и можно безопасно округлять в большую или меньшую сторону, просто умножьте на 100. В моем примере это будет 10023 как целое число для хранения. Вы сэкономите место в базе данных, и сравнение двух целых чисел будет намного проще, чем сравнение двух чисел с плавающей запятой. Мои 0,02 доллара.

супер поздняя запись, но GAAP - хорошее эмпирическое правило.

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

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

Источник: Лучший тип данных для хранения денежной стоимости в MySQL

Вы можете использовать что-то вроде DECIMAL (19,2) по умолчанию для всех ваших денежных значений, но если вы будете хранить только значения ниже 1000 долларов, это будет пустой тратой. ценного пространства базы данных.

Для большинства реализаций было бы достаточно DECIMAL (N, 2) , где значение N равно как минимум количеству цифр перед . самой большой суммы, которую вы когда-либо ожидали сохранить в этом поле + 5 . Поэтому, если вы никогда не ожидаете хранить какие-либо значения, превышающие 999999,99, DECIMAL (11,2) должно быть более чем достаточно (до тех пор, пока ожидания не изменятся).

Если вы хотите быть GAAP , вы можете использовать DECIMAL (N, 4) , где значение N равно как минимум количеству цифр перед . самой большой суммы, которую вы когда-либо ожидали сохранить в этом поле + 7 .

Это зависит от характера данных.Вам нужно обдумать это заранее.

Мое дело

  • decimal(13,4) без знака для записи денежных операций
    • эффективность хранения (в любом случае 4 байта для каждой стороны десятичной точки) 1
    • Соответствует GAAP
  • десятичное число (19,4) без знака для агрегатов
    • нам нужно больше места для сумм нескольких многомиллиардных транзакций
    • частичное соответствие типу данных MS Currency не повредит 2
    • на запись потребуется больше места (11 байт — 7 слева и 4 справа), но это нормально, поскольку для агрегатов меньше записей 1
  • десятичная дробь (10,5) для курсов валют
    • они обычно обозначаются пятью цифрами, поэтому вы можете найти такие значения, как 1,2345 и 12,345, но не 12345,67890.
    • это широко распространенное соглашение, но не кодифицированный стандарт (по крайней мере, насколько я знаю)
    • вы можете сделать его десятичным (18,9) с тем же хранилищем, но ограничения типа данных являются ценным встроенным механизмом проверки.

Почему (М,4)?

  • есть валюты, которые делятся на тысячу пенни
  • существуют денежные эквиваленты, такие как «Unidad de Fermento», «CLF», выраженные с помощью 4 значащих десятичных знаков. 3,4
  • это соответствует GAAP

Компромисс

  • более низкая точность:
    • меньше затрат на хранение
    • более быстрые вычисления
    • меньший риск ошибки расчета
    • более быстрое резервное копирование и восстановление
  • более высокая точность:
    • будущая совместимость (количество имеет тенденцию к росту)
    • экономия времени разработки (не придется пересобирать половину системы при соблюдении лимитов)
    • меньший риск производственного сбоя из-за недостаточной точности хранения

Совместимый экстрим

Хотя MySQL позволяет использовать десятичное число (65,30), 31 для масштаба и 30 для точности кажутся нашими ограничениями, если мы хотим оставить опцию передачи открытой.

Максимальный масштаб и точность в наиболее распространенных СУБД:

            Precision   Scale
Oracle      31          31
T-SQL       38          38
MySQL       65          30
PostgreSQL  131072      16383

6, 7, 8, 9

Разумный экстрим

  1. Почему (27,4)?
    • никогда не знаешь, когда в системе потребуется хранить зимбабвийские доллары

Сентябрь 2015 года правительство Зимбабве заявило, что обменяет зимбабвийские доллары на доллары США по курсу от 1 до 35 квадриллионов зимбабвийских долларов. 5

Мы склонны говорить: «Да, конечно…Мне не нужны эти сумасшедшие цифры».Ну, зимбабвийцы тоже так говорили.Не так давно.

Предположим, вам нужно зарегистрировать транзакцию на сумму 1 миллион долларов США в зимбабвийских долларах (возможно, сегодня это маловероятно, но кто знает, как это будет выглядеть через 10 лет?).

  1. (1 миллион долларов США) * (35 квадрилионов ZWL) = ( 10^6 ) * (35 * 10^15) = 35 * 10^21
  2. нам нужно:
    • 2 цифры для хранения «35»
    • 21 цифра для хранения нулей
    • 4 цифры справа от десятичной точки
  3. это дает десятичное число (27,4), что обходится нам в 15 байт на каждую запись.
  4. мы можем бесплатно добавить еще одну цифру слева — у нас есть десятичное число (28,4) для 15 байт.
  5. Теперь мы можем хранить транзакции на сумму 10 миллионов долларов США, выраженные в зимбабвийских долларах, или застраховаться от нового удара гиперинфляции, которого, мы надеемся, не произойдет.

Хотя это может быть поздно, но это будет полезно для кого-то еще. Из моего опыта и исследований я узнал и принял десятичное число (19, 6). Это при работе с php и mysql. при работе с большой суммой денег и курсом валют

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top