ОК, поэтому я знаю, что есть много статей, в которых говорится, что я не должен использовать DOUBLE для хранения денег в базе данных MySQL, иначе у меня появятся сложные ошибки. Дело в том, что я не разрабатываю новую базу данных, я прошу найти способ оптимизации существующей системы. Более новая версия содержит 783 DOUBLE типизированных столбцов, большинство из которых используется для хранения денег или формулы для расчета суммы денег.
Итак, мое первое мнение по этому вопросу было я настоятельно рекомендую преобразовать из DOUBLE в DECIMAL в следующей версии, потому что doc MySQL и все так говорят. Но тогда я не мог найти подходящего аргумента, чтобы оправдать эту рекомендацию по трем причинам:
- Мы не выполняем вычисления в базе данных. Все операции выполняются на Java с использованием BigDecimal, а MySQL используется просто для хранения результатов.
- Точность в 15 цифр, которую предлагает DOUBLE, достаточно много, так как мы храним в основном суммы с 2 десятичными цифрами и иногда небольшие числа с 8 десятичными знаками для аргументов формулы.
- У нас есть 6-летний рекорд в производстве без известной проблемы с ошибкой из-за потери точности на стороне MySQL.
Даже выполняя операции над таблицей строк в 18 миллинов, например SUM и сложными умножениями, я не мог выполнить ошибку отсутствия точности. И мы фактически не делаем такого рода вещи в производстве. Я могу показать потерю точности, выполняя что-то вроде
SELECT columnName * 1.000000000000000 FROM tableName;
Но я не могу понять, как превратить его в ошибку во второй десятичной цифре. Большинство реальных проблем, которые я нашел в Интернете, - это записи 2005 года и старше в форуме, и я не смог воспроизвести их на сервере MySQL 5.0.51.
Итак, до тех пор, пока мы не выполним никаких арифметических операций SQL, которые мы не планируем делать, есть ли какая-то проблема, которую мы должны ожидать от хранения и возврата суммы денег в столбце DOUBLE?