Как использовать MySQL DECIMAL?

178

Я не могу понять DECIMAL MySQL. Мне нужно, чтобы строка могла содержать число от 00.0001 до 99.9999. Как бы я структурировал его так, чтобы он работал так?

Чарльз Цинк
источник
8
(Ссылка) dev.mysql.com/doc/refman/5.1/en/…
Пекка
4
Вы должны действительно принять правильный ответ. В настоящее время принят неправильный ответ.
Ольховский
2
Закончился здесь и прочитал ответ, утверждая, что DECIMAL UNSIGNED не представляется возможным. Смотрите свежий ответ ниже для правильной спецификации для этого.
Маркус А.О.

Ответы:

440

Столбцы DOUBLE не совпадают со столбцами DECIMAL, и у вас возникнут проблемы, если вы будете использовать столбцы DOUBLE для финансовых данных.

DOUBLE на самом деле просто FLOAT версия с двойной точностью (64 бит вместо 32 бит) . Числа с плавающей точкой являются приблизительными представлениями действительных чисел, и они не являются точными. На самом деле, простые числа, такие как 0,01, не имеют точного представления в типах FLOAT или DOUBLE.

Столбцы DECIMAL являются точными представлениями, но они занимают гораздо больше места для гораздо меньшего диапазона возможных чисел. Чтобы создать столбец, способный содержать значения от 0,0001 до 99,9999, как вы и просили, вам понадобится следующее утверждение

CREATE TABLE your_table
(
    your_column DECIMAL(6,4) NOT NULL
);

Определение столбца соответствует формату DECIMAL (M, D), где M - максимальное количество цифр ( точность ), а D - количество цифр справа от десятичной точки ( шкала ).

Это означает, что предыдущая команда создает столбец, который принимает значения от -99,9999 до 99,9999. Вы также можете создать столбец НЕПИСАННЫЙ ДЕСЯТИЧНЫЙ в диапазоне от 0,0000 до 99,9999.

Для получения дополнительной информации о MySQL DECIMAL официальные документы всегда являются отличным ресурсом.

Имейте в виду, что вся эта информация верна для версий MySQL 5.0.3 и выше. Если вы используете предыдущие версии, вам действительно следует обновить.

Алекс Ресари
источник
17
Проголосовал ваш ответ. Ваш ответ правильный, другой ответ - нет (поскольку он утверждает, что "double = decimal"). DECIMAL - это тип с фиксированной запятой с точным значением, а его синонимами являются NUMERIC, DEC и FIXED. Не DOUBLE, потому что DOUBLE - это тип с плавающей запятой, который представляет приблизительные числовые значения данных. При использовании DECIMAL (<1-65>, <0-30>) первый параметр - это количество цифр, второй - число цифр справа от десятичной точки.
Норберт
2
Да ты прав. Обратите внимание, что это работа для MySQL 5.0.3 и выше, dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html
ajreal
1
Плакат попросил десятичное поле, которое содержало значения от 0,0001 до 99,9999. Я добавил дополнительную информацию, чтобы уточнить, что созданное поле действительно поддерживает значения от -99,9999 до 99,9999. Спасибо за ответ! Также добавлен отказ от версии MySQL.
Алекс Рекари
1
Вы сказали: «Невозможно создать« беззнаковый »столбец DECIMAL», однако в вашем примере кода указано «DECIMAL (6,4) UNSIGNED NOT NULL». Почему это?
Лян
3
@AlexRecarey Кажется, я могу создать ДЕСЯТИЧНУЮ ПОДПИСАНУ; и руководство по MySQL 5.x соглашается: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Он вернет ошибку вне диапазона для отрицательных значений. Вы также можете создать без знака FLOAT и DOUBLE. Руководство: dev.mysql.com/doc/refman/5.0/ru/numeric-type-overview.html
Маркус А.О.
68

Хотя приведенные выше ответы кажутся правильными, просто простое объяснение, чтобы дать вам представление о том, как это работает.

Предположим, что ваш столбец установлен в DECIMAL(13,4). Это означает, что общий размер столбца будет составлять 13 цифр, из которых 4 будут использоваться для точного представления.

Итак, в итоге, для этого столбца у вас будет максимальное значение: 999999999.9999

Cristiano
источник
1
лучший ответ здесь
Джулиан Сильвестри
15

Есть правильные решения в комментариях, но суммировать их в один ответ:

Вы должны использовать DECIMAL (6,4).

Тогда у вас может быть 6 общих чисел, 2 до и 4 после десятичной точки (шкала). По крайней мере, в соответствии с этим .

Золтан Хайду
источник
6

MySQL 5.x спецификация для десятичного типа данных является: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Ответ выше неверен, говоря, что беззнаковые десятичные числа невозможны.

Чтобы определить поле , позволяющее только неподписанные знаки после запятой, с общей длиной 6 цифр, 4 из которых являются десятичными, вы должны использовать: DECIMAL (6,4) UNSIGNED.

Вы также можете создавать неподписанные (т.е. не отрицательные) типы данных FLOAT и DOUBLE.

Маркус А.О.
источник