Я хочу хранить много записей в базе данных MySQL. Все они содержат денежные значения. Но я не знаю, сколько цифр будет вставлено для каждого.
Какой тип данных я должен использовать для этой цели?
VARCHAR или INT (или другие числовые типы данных)?
mysql
sqldatatypes
currency
Мухаммед Сабери
источник
источник
deimal(10,2)
это то, что я использую ... вы можете настроить значения в зависимости от ожидаемого размераОтветы:
Поскольку деньги нуждаются в точном представлении, не используйте типы данных, которые являются приблизительными
float
. Вы можете использовать числовой тип данных с фиксированной запятой для этого как15
это точность (общая длина значения, включая десятичные разряды)2
количество цифр после десятичной точкиСмотрите MySQL Числовые типы :
источник
decimal
иnumeric
то же самое.numeric(19,4)
для финансовых отчетов, что дает вам лучшую руку, чтобы легко играть и принимать новые запросы.Вы можете использовать
DECIMAL
илиNUMERIC
оба одинаковыт.е.
DECIMAL(10,2)
Хорошо читать
источник
Я предпочитаю использовать
BIGINT
и хранить значения путем умножения на 100 , чтобы оно стало целым числом.Например, для представления значения в валюте значение
93.49
должно быть сохранено как9349
при отображении значения, которое мы можем разделить на 100, и отобразить. Это займет меньше места для хранения.источник
DECIMAL
? Вы создаете необходимость переводить копейки в доллары, и горе, если вы забудете об этом в какой-то момент.$0.005
или$0.12345
), потому что они не будут уменьшаться до целого числа после умножения на 100. Если вы знаете точность значений, это ясно Лучший вариант - использоватьDECIMAL
. Но если вы не знаете точности (как в моих примерах), тогда ... будетFLOAT
уместно?Это зависит от ваших потребностей.
Использование
DECIMAL(10,2)
обычно достаточно , но если вам нужно немного более точные значения , которые вы можете установитьDECIMAL(10,4)
.Если вы работаете с большими значениями, замените
10
на19
.источник
Если ваше приложение должно обрабатывать денежные значения до триллиона, это должно работать: 13,2 Если вам нужно соблюдать GAAP (общепринятые принципы бухгалтерского учета), тогда используйте: 13,4
Обычно вы должны суммировать свои денежные значения в 13,4 до округления результата до 13,2.
источник
На самом деле это зависит от предпочтений программиста. Я лично использую:
numeric(15,4)
чтобы соответствовать Общепринятым принципам бухгалтерского учета ( GAAP ) .источник
Попробуйте использовать
это обычно работает с любой другой БД
источник
Мы используем
double
.* Удушье *
Зачем?
Потому что он может представлять любое 15-значное число без каких-либо ограничений на то, где находится десятичная точка . Все за жалкие 8 байтов!
Так что это может представлять:
0.123456789012345
123456789012345.0
... и все что между
Это полезно, потому что мы имеем дело с глобальными валютами и
double
можем хранить различное количество десятичных разрядов, с которыми мы, вероятно, столкнемся.Один
double
поле может представлять 999,999,999,999,999s в японских йенах, 9,999,999,999,999.99s в долларах США и даже 9,999,999.99999999s в BitcoinsЕсли вы попытаетесь сделать то же самое с
decimal
, вам нужно,decimal(30, 15)
что стоит 14 байтов.Предостережения
Конечно, использование
double
не без предостережений.Тем не менее, это не потеря точности, как указывают некоторые. Даже если
double
сам по себе он не может быть внутренне точным для системы base 10 , мы можем сделать его точным, округлив значение, которое мы извлекаем из базы данных, до ее значащих десятичных разрядов. При необходимости это так. (Например, если он будет выведен, и требуется представление базы 10).Предостережения: всякий раз, когда мы выполняем с ним арифметику, нам нужно нормализовать результат (округляя его до значащих десятичных разрядов) перед:
Еще один вид предостережения: в отличие от того,
decimal(m, d)
где база данных будет препятствовать программам вставлять число, состоящее более чем изm
цифр, таких проверок не существуетdouble
. Программа может вставить введенное пользователем значение из 20 цифр, и в итоге она будет записана в виде неточной суммы.источник
1.410000000000
000 000 000 (запятая как разделитель тысяч), предполагается, что входные данные (двенадцать значащих десятичных разрядов), но умножение на 1 000 000 000 000 (что на 13 значащих цифр слева от десятичной точки) означает, что мы работаем с минимум 25 комбинированных значащих цифр. Это намного превосходит 15 доступных для двойного, поэтому по дизайну я думаю, что это будет очень сломано.В то время, когда этот вопрос задавали, никто не задумывался о цене биткойна. В случае BTC его, вероятно, недостаточно использовать
DECIMAL(15,2)
. Если биткойн вырастет до 100 000 долларов или больше, нам потребуется хотя быDECIMAL(18,9)
поддержка криптовалют в наших приложениях.DECIMAL(18,9)
занимает 12 байтов пространства в MySQL ( 4 байта на 9 цифр ).источник
Хранение денег,
BIGINT
умноженное на 100 или более с целью использовать меньше места для хранения, не имеет смысла во всех «нормальных» ситуациях.DECIMAL(13,4)
DECIMAL
.DECIMAL(13,4)
представляет 9 цифр + 4 цифры дроби (десятичные разряды) => 4 + 2 байта = 6 байтовBIGINT
.источник
Если требуется соответствие GAAP или вам нужно 4 десятичных знака:
DECIMAL (13, 4), который поддерживает максимальное значение:
$ 999,999,999.9999
В противном случае, если достаточно 2 десятичных разряда: DECIMAL (13,2)
источник: https://rietta.com/blog/best-data-types-for-currencymoney-in/
источник
Умножает 10000 и сохраняет как BIGINT, например, «Валюта» в Visual Basic и Office. См. Https://msdn.microsoft.com/en-us/library/office/gg264338.aspx.
источник