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

Я хочу хранить много записей в базе данных MySQL. Все они содержат денежные ценности. Но я не знаю, сколько цифр будет вставлено для каждого из них.
Какой тип данных я должен использовать для этой цели?
VARCHAR или INT (или другие числовые типы данных)?

Поскольку деньги нуждаются в точном представлении, не используйте типы данных, которые являются приблизительными, как float . Вы можете использовать числовой тип данных с фиксированной точкой для

 decimal(15,2) 
  • 15 – точность (общая длина значения, включая десятичные разряды)
  • 2 – количество цифр после десятичной точки

См. MySQL Числовые типы :

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

Вы можете использовать DECIMAL или NUMERIC оба они одинаковы

Типы DECIMAL и NUMERIC сохраняют точные значения числовых данных. Эти типы используются, когда важно сохранять точную точность, например, с денежными данными. В MySQL NUMERIC реализуется как DECIMAL, поэтому следующие замечания о DECIMAL одинаково применимы к NUMERIC. : MySQL

т.е. DECIMAL(10,2)

Примеры настроек

Хорошо для чтения

Это зависит от ваших потребностей.

Обычно использовать DECIMAL(10,2) достаточно, но если вам нужны более точные значения, вы можете установить DECIMAL(10,4) .

Если вы работаете с большими значениями, замените 10 на 19 .

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

Например, чтобы представить значение валюты 93.49 , значение должно быть сохранено как 9349 , показывая значение, которое мы можем разделить на 100 и отобразить. Это займет меньше места для хранения.

Внимание:
В основном мы не используем currency * currency умножение currency * currency , в случае, если мы это делаем, тогда разделим результат на 100 и сохраним, чтобы он возвращался к правильной точности.

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

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

Действительно, это зависит от предпочтений программиста. Я лично использую: numeric(15,4) для соответствия общепринятым принципам бухгалтерского учета ( GAAP ) .

Попробуйте использовать

 Decimal(19,4) 

это обычно работает и с каждой другой БД

В то время, когда этот вопрос задавали, никто не думал о цене Биткойна. В случае BTC, вероятно, недостаточно использовать DECIMAL(15,2) . Если биткойн вырастет до 100 000 долларов или более, нам понадобится по крайней мере DECIMAL(18,9) для поддержки криптоконверсий в наших приложениях.

DECIMAL(18,9) занимает 12 байт пространства в MySQL ( 4 байта на 9 цифр ).

Мы используем double .

* удушье *

Зачем?

Потому что он может представлять любое 15-значное число без ограничений на то, где находится десятичная точка . Все для мертвых 8 байтов!

Таким образом, он может представлять:

  • 0.123456789012345
  • 123456789012345.0

… и все, что между ними.

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

Одно double поле может представлять 999,999,999,999,999s в японских иенах, 9,999,999,999,999,99s в долларах США и даже 9,999,999,99999999 в биткойнах

Если вы попытаетесь сделать то же самое с decimal , вам понадобится decimal(30, 15) которая стоит 14 байт.

Предостережения

Конечно, использование double не обойтись без оговорок.

Тем не менее, это не потеря точности, как некоторые указывают на это. Даже если double само по себе не может быть внутренне точным для базовой системы 10 , мы можем сделать это точным, округляя значение, которое мы вытаскиваем из базы данных, до ее значительных десятичных знаков. Если это необходимо. (например, если он будет выведен, и требуется представление базы 10).

Оговорки – в любой момент, когда мы выполняем арифметику с ней, нам нужно нормализовать результат (округляя его до значащих десятичных знаков) до:

  1. Выполнение сравнений на нем.
  2. Запись в базу данных.

Другой вид предостережения – в отличие от decimal(m, d) когда firebase database будет препятствовать тому, чтобы программы вставляли число с более чем double цифрами, таких проверок не существует с double . Программа может вставить введенное пользователем значение в 20 цифр, и в итоге оно будет записано без учета неточной суммы.

Умножает 10000 и сохраняет как BIGINT, например «Currency» в Visual Basic и Office. См. https://msdn.microsoft.com/en-us/library/office/gg264338.aspx

Давайте будем гением компьютера.