Хранение значений валюты в базе данных MySQL

этот вопрос задавался много раз раньше, но я нашел противоречивые мнения по этой теме, поэтому я подумал, что снова подниму его в надежде на более унифицированный вывод.

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

моей первоначальной мыслью было бы сохранить значение как целое число со знаком в терминах наименьшего единица связанной валюты. Например, если я хочу сохранить значение 1.25$, я бы вставить 125 в базу данных, так как наименьшая единица USD составляет $ 0.01. Хорошая вещь об этом методе заключается в том, что MySQL автоматически округляется до ближайшего целого числа. Например, если значение доллара равно $ 1.259, я мог бы вставить 125.9, который будет автоматически округлен и сохранен как 126 или $1.26.

Итак, что вы думаете? Это разумный подход или есть лучший? способ?

2 ответов


финансовые данные могут храниться как DECIMAL(p,s) где p-количество значащих цифр, а s-масштаб (количество мест справа от десятичной точки). См.документация MySQL.

также от О'Рейли Высокая Производительность MySQL, Глава 3:

"...вы должны использовать DECIMAL только тогда, когда вам нужны точные результаты для дробные числа-например, при хранении финансовых данных."

от О'Рейли!--16-->Изучение MySQL:

DECIMAL is,"...Часто используемый числовой тип. Сохраняет фиксированную точку номер, такой как зарплата или расстояние..."

и MySQL Карманный Справочник:

DECIMAL "...Сохраняет числа с плавающей запятой, где точность критические, например, для денежных ценностей."


нет ничего плохого в подходе, который вы описываете. В этом вопросе нет ни правильного, ни неправильного.

вы должны иметь в виду, что для отображения $ value пользователю вам нужно будет всегда выполнять операцию деления или какое-то форматирование.

будет ли проще отлаживать ваши формулы / вычисления, если все было в центах или долларах? Будете ли вы отображать значения в центах или долларах? так далее.

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