Лучший тип данных для хранения денежных значений в MySQL
Я хочу хранить много записей в базе данных MySQL. Все они содержат денежные величины. Но я не знаю, сколько цифр будет вставлено для каждого из них.
Какой тип данных я должен использовать для этой цели?
тип varchar или INT (или другие числовые типы данных)?
10 ответов:
поскольку деньги нуждаются в точном представлении, не используйте типы данных, которые являются только приблизительными, как
float
. Для этого можно использовать числовой тип данных с фиксированной точкой, напримерdecimal(15,2)
15
это точность (общая длина значения, включая десятичные знаки)2
- это количество цифр после запятойпосмотреть Числовые Типы MySQL:
эти типы используются, когда важно сохраняйте точную точность, например с помощью денежный данные.
можно использовать
DECIMAL
илиNUMERIC
так жедесятичные и числовые типы хранят точные числовые значения данных. Эти типы используются, когда важно сохранить точную точность, например, с денежными данными. В MySQL, числовые реализуется в виде десятичной, поэтому следующие замечания о десятичной в равной степени применяются к числовым. :MySQL
т. е.
DECIMAL(10,2)
Это зависит от ваших потребностей.
используя
DECIMAL(10,2)
обычно достаточно, но если вам нужно немного более точные значения можно установитьDECIMAL(10,4)
.если вы работаете с большими значениями заменить
10
С19
.
Я предпочитаю использовать
BIGINT
, и хранить значения в умножить на 100, так что он станет целым числом.например, для представления значения валюты
93.49
, значение должно храниться как9349
, при отображении значения мы можем делим на 100 и дисплей. Это займет меньше места для хранения.внимание:
В основном мы не делаемcurrency * currency
умножение, в случае если мы делаем это затем разделите результат на 100 и сохраните, чтобы он вернулся к правильной точности.
Если ваше приложение должно обрабатывать денежные значения до триллиона, то это должно работать: 13,2 Если вам необходимо соблюдать GAAP (общепринятые принципы бухгалтерского учета), то используйте: 13,4
обычно вы должны суммировать свои денежные значения в 13,4 перед округлением вывода до 13,2.
действительно, это зависит от предпочтений программиста. Я лично использую:
numeric(15,4)
соответствуют Общепринятые Принципы Бухгалтерского Учета ( GAAP).
В то время, когда этот вопрос был задан, никто не думал о Bitcoin цене. В случае с БТД, то, вероятно, недостаточно, чтобы использовать
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,999 s в японских иенах, 9,999,999,999,999. 99 s в долларах США и даже 9,999,999. 99999999 s в биткойнахесли вы попробуете сделать то же самое с
decimal
необходимоdecimal(30, 15)
, который стоит 14 байт.предостережения
конечно, с помощью
, это не потеря точности, как некоторые склонны указывать. Даже еслиdouble
не без предостережений.double
сам по себе не может быть внутренне точно к основанию 10, мы можем сделать его точно как округление значение мы вытаскиваем из базы данных ее значительные десятичные разряды. Если это необходимо. (например, если он будет выведен, и требуется представление базы 10.)предостережения, каждый раз, когда мы выполняем арифметику с это, нам нужно нормализовать результат (округляя его до значащих десятичных знаков) перед:
- выполнение сравнения на нем.
- запись его обратно в базу данных.
еще один вид предостережения, в отличие от
decimal(m, d)
где база данных будет препятствовать программам вставлять число с более чемm
цифры, такие проверки не существует сdouble
. Программа может вставить введенное пользователем значение из 20 цифр, и он будет в конечном итоге молча записывается как неточная сумма.
умножает 10000 и хранит как BIGINT, как "валюта" в Visual Basic и Office. См.https://msdn.microsoft.com/en-us/library/office/gg264338.aspx