Сохранение значений валюты в базе данных MySQL
Этот вопрос задавался много раз раньше, но я нашел противоречивые мнения по этой теме, поэтому я подумал, что снова подниму его в надежде на более унифицированный вывод.
Я хотел бы сохранить значение валюты в моей базе данных. Предположим, что все записи представляют собой один и тот же тип валюты (например, доллар США) и что допустимы как положительные, так и отрицательные значения.
Моя первоначальная мысль заключалась в том, чтобы сохранить значение как целое число со знаком в терминах наименьшей единицы соответствующей валюты. Например, если я хочу сохранить значение $1,25, я бы ввел 125
в базу данных, так как наименьшая единица USD составляет 0,01 доллара США. Самое приятное в этом методе заключается в том, что MySQL автоматически округляется до ближайшего целого. Например, если значение доллара составляет $1,259, я мог бы вставить 125.9
, который будет автоматически округлен и сохранен как 126
или $1.26.
Итак, что вы думаете? Является ли это правильным подходом или есть лучший способ?
Ответы
Ответ 1
Финансовые данные могут храниться как DECIMAL(p,s)
, где p - количество значащих цифр, а s - масштаб (количество мест справа от десятичной точки). См. Документация по MySQL.
Также из O'Reilly Высокопроизводительный MySQL, глава 3:
"... вы должны использовать DECIMAL только тогда, когда вам нужны точные результаты для дробные числа - например, при хранении финансовых данных.
Из O'Reilly Изучение MySQL:
DECIMAL
: "... Обычно используемый числовой тип. Сохраняет фиксированную точку число, такое как зарплата или расстояние..."
И Справочник по MySQL Pocket:
DECIMAL
"... Сохраняет числа с плавающей запятой, где точность критический, например, для денежных значений".
Ответ 2
В описанном вами подходе нет ничего плохого. В этом вопросе нет правильного или неправильного решения.
Вы должны иметь в виду, что для отображения значения $пользователю необходимо всегда выполнять операцию деления или какое-то форматирование.
Будет ли проще отлаживать ваши формулы/вычисления, если все было в центах или долларах? Будете ли вы показывать значения в центах или долларах? и др.
Держите его простым, но в любом случае вам придется использовать десятичное число.