Какой тип данных SQL является лучшим для значений валют? Я использую MySQL, но предпочел бы независимый от базы данных тип.
Какой тип данных SQL является лучшим для значений валют? Я использую MySQL, но предпочел бы независимый от базы данных тип.
Ответы:
Нечто подобное Decimal(19,4)
обычно работает довольно хорошо в большинстве случаев. Вы можете отрегулировать масштаб и точность, чтобы соответствовать потребностям чисел, которые вам нужно хранить. Даже в SQL Server я не использую " money
", поскольку это нестандартно.
(19,4)
вместо (19,2)
?
Единственное, на что вам следует обратить внимание - если вы переходите с одной базы данных на другую, вы можете обнаружить, что DECIMAL (19,4) и DECIMAL (19,4) означают разные вещи.
( http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html )
DBASE: 10,5 (10 целых, 5 десятичных) MYSQL: 15,5 (15 цифр, 10 целых (15-5), 5 десятичных)
Также важно определить, сколько десятичных знаков может потребоваться для ваших расчетов.
Я работал над приложением цены акций, которое требовало расчета цены одного миллиона акций. Указанная цена акции должна была храниться с точностью до 7 цифр.
Ответ Асафа о
Зависит от того, сколько денег вы получили ...
звучит легкомысленно, но на самом деле это уместно.
Только сегодня у нас возникла проблема, из-за которой запись не удалось вставить в нашу таблицу тарифов, потому что для одного из столбцов (GrossRate) установлено значение Десятичное число (11,4), а наш отдел продуктов только что получил контракт на номера в каком-то удивительном курорте. в Бора-Бора, которые продают за несколько миллионов тихоокеанских франков за ночь ... что никогда не было предвзятым при разработке схемы базы данных 10 лет назад.
Для бухгалтерских приложений очень распространено хранить значения как целые числа (некоторые даже заходят так далеко, что говорят, что это единственный способ). Чтобы получить представление, возьмите сумму транзакций (предположим, $ 100,23) и умножьте ее на 100, 1000, 10000 и т. Д., Чтобы получить необходимую точность. Так что если вам нужно только хранить центы и можно безопасно округлять в большую или меньшую сторону, просто умножьте на 100. В моем примере это будет 10023 как целое число для хранения. Вы сэкономите место в базе данных, и сравнение двух целых чисел будет намного проще, чем сравнение двух чисел с плавающей запятой. Мои $ 0,02.
DECIMAL
? Вы должны быть очень осторожны с тем, чтобы всегда переводить пенни, мельницы или миллионы в доллары в подходящее время.
супер поздняя запись, но 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
.
Это зависит от характера данных. Вы должны обдумать это заранее.
Хотя MySQL позволяет вам использовать десятичную (65,30), 31 для масштаба и 30 для точности кажутся нашими ограничениями, если мы хотим оставить опцию передачи открытой.
Максимальный масштаб и точность в наиболее распространенных СУБД:
Точность Шкала Oracle 31 31 T-SQL 38 38 MySQL 65 30 PostgreSQL 131072 16383
Сентябрь 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. при работе с большой суммой денег и курсом обмена