DOUBLE vs DECIMAL в MySQL

Хорошо, я знаю, что есть масса статей, в которых говорится, что мне не следует использовать DOUBLE для хранения денег в базе данных MySQL, иначе я получу хитрые ошибки точности. Дело в том, что я не разрабатываю новую базу данных, меня просят найти способ оптимизировать существующую систему. Новая версия содержит 783 столбца с ДВОЙНЫМ типом, большинство из которых используется для хранения денег или формулы для вычисления денежной суммы.

Таким образом, мое первое мнение по этому поводу заключалось в том, что в следующей версии я настоятельно рекомендую преобразование из DOUBLE в DECIMAL, потому что документ MySQL, и все так говорят. Но тогда я не смог найти никаких веских аргументов в пользу этой рекомендации по трем причинам:

  • Мы не выполняем никаких вычислений в базе данных. Все операции выполняются на Java с использованием BigDecimal, а MySQL используется просто как обычное хранилище для результатов.
  • Точность 15 цифр, которую предлагает DOUBLE, достаточно, поскольку мы храним в основном суммы с двумя десятичными цифрами и иногда небольшие числа с 8 десятичные цифры для аргументов формул.
  • У нас есть 6-летний опыт производства без каких-либо известных ошибок из-за потери точности на стороне MySQL.

Даже при выполнении операций с таблицей из 18 миллионов строк, например SUM и сложные умножения, я не мог выполнить ошибку из-за отсутствия точности. И мы на самом деле не делаем этого на производстве. Я могу показать потерю точности, выполнив что-то вроде

SELECT columnName * 1.000000000000000 FROM tableName;

Но я не могу придумать способ превратить это в ошибку на 2-й десятичной цифре. Большинство реальных проблем, которые я обнаружил в Интернете, - это записи форума 2005 года и более ранние, и я не мог воспроизвести ни одну из них на сервере MySQL 5.0.51.

Так что, пока мы не выполняем никаких арифметических операций SQL, чего мы не планируем делать, есть ли какие-то проблемы, которых следует ожидать от только хранения и получения денежной суммы в столбце DOUBLE?

63
задан user327961 26 July 2011 в 14:02
поделиться