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

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

+249
23 окт. '12 в 12:25
источник поделиться
11 ответов

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

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

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

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

+332
23 окт. '12 в 12:26
источник

Связанные вопросы


Похожие вопросы

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

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

то есть. DECIMAL(10,2)

Example settings

Хорошее чтение

+83
23 окт. '12 в 12:27
источник

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

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

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

+29
03 сент. '14 в 7:14
источник

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

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

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

+26
23 окт. '12 в 12:30
источник

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

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

+14
28 апр. '14 в 23:40
источник

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

+6
16 сент. '14 в 7:41
источник

Мы используем 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), где база данных будет препятствовать программы от вставки числа с более m цифр, нет таких валидаций не существует с double. Программа может вставить введенное пользователем значение в 20 цифр, и в итоге оно будет записано без учета неточной суммы.

+3
03 апр. '18 в 7:12
источник

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

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

+3
06 янв. '18 в 10:34
источник

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

Decimal(19,4)

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

+3
05 мар. '16 в 9:40
источник

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

0
08 нояб. '15 в 13:09
источник

Хранение денег как BIGINT умноженное на 100 или более с целью использовать меньше места для хранения, не имеет смысла во всех "нормальных" ситуациях.

  • Чтобы оставаться в соответствии с GAAP, достаточно хранить валюты в DECIMAL(13,4)
  • Руководство MySQL гласит, что для хранения DECIMAL требуется 4 байта на 9 цифр.
  • DECIMAL(13,4) представляет 9 цифр + 4 цифры дроби (десятичные разряды) => 4 + 2 байта = 6 байтов
  • сравните с 8 байтами, необходимыми для хранения BIGINT.
0
14 июн. '19 в 6:17
источник

Посмотрите другие вопросы по меткам или Задайте вопрос