Лучший тип данных для хранения значений валюты в базе данных MySQL
-
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) без знака для агрегатов
- десятичная дробь (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
Разумный экстрим
- Почему (27,4)?
- никогда не знаешь, когда в системе потребуется хранить зимбабвийские доллары
Сентябрь 2015 года правительство Зимбабве заявило, что обменяет зимбабвийские доллары на доллары США по курсу от 1 до 35 квадриллионов зимбабвийских долларов. 5
Мы склонны говорить: «Да, конечно…Мне не нужны эти сумасшедшие цифры».Ну, зимбабвийцы тоже так говорили.Не так давно.
Предположим, вам нужно зарегистрировать транзакцию на сумму 1 миллион долларов США в зимбабвийских долларах (возможно, сегодня это маловероятно, но кто знает, как это будет выглядеть через 10 лет?).
- (1 миллион долларов США) * (35 квадрилионов ZWL) = ( 10^6 ) * (35 * 10^15) = 35 * 10^21
- нам нужно:
- 2 цифры для хранения «35»
- 21 цифра для хранения нулей
- 4 цифры справа от десятичной точки
- это дает десятичное число (27,4), что обходится нам в 15 байт на каждую запись.
- мы можем бесплатно добавить еще одну цифру слева — у нас есть десятичное число (28,4) для 15 байт.
- Теперь мы можем хранить транзакции на сумму 10 миллионов долларов США, выраженные в зимбабвийских долларах, или застраховаться от нового удара гиперинфляции, которого, мы надеемся, не произойдет.
Хотя это может быть поздно, но это будет полезно для кого-то еще. Из моего опыта и исследований я узнал и принял десятичное число (19, 6). Это при работе с php и mysql. при работе с большой суммой денег и курсом валют