Як користуватися MySQL DECIMAL?


177

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



4
Ви дійсно повинні прийняти правильну відповідь. В даний час прийнята відповідь неправильна.
Ольховський

2
Закінчився тут і прочитав відповідь із твердженням про те, що ДЕКІМАЛЬНЕ ЗНАЧЕНО неможливо. Дивіться свіжу відповідь нижче для правильної специфікації для цього.
Маркус AO

Відповіді:


439

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

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

ДЕКІМАЛЬНІ стовпці - це точні уявлення, але вони займають набагато більше місця для набагато меншого діапазону можливих чисел. Для створення стовпця, здатного містити значення від 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
Проголосував вашу відповідь. Ваша відповідь правильна, інша відповідь - ні (оскільки вона стверджує, що "подвійний = десятковий"). DECIMAL - це тип з фіксованою точкою з точним значенням, а його синоніми - NUMERIC, DEC і FIXED. Не DOUBLE, оскільки DOUBLE - тип з плаваючою комою, який представляє приблизні числові значення даних. При використанні DECIMAL (<1-65>, <0-30>) перший параметр - це кількість цифр, другий - кількість цифр праворуч від десяткової коми.
Норберт

2
Так, ти маєш рацію. Зверніть увагу, що це робота для MySQL 5.0.3 і далі, dev.mysql.com/doc/refman/5.1/uk/precision-math-examples.html
ajreal

1
Плакат запитував десяткове поле, яке містило значення від 0,0001 до 99,9999. Я додав додаткову інформацію, щоб уточнити, що створене поле насправді підтримує значення від -99,9999 до 99,9999. Дякуємо за відгук! Також додано відмову від версії MySQL.
Алекс Рекарей

1
Ви сказали, що "немає способу створити" безпідписаний "стовпець" DECIMAL ", але ваш приклад коду вказує" DECIMAL (6,4) UNSIGNED NOT NULL ". Чому це?
laang

3
@AlexRecarey Мені здається, що я можу створити ДЕКІМАЛЬНЕ НЕЗНАЧЕНО; і керівництво по MySQL 5.x погоджується: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Він поверне помилку поза межами діапазону для негативних значень. Ви також можете створити неподписані FLOAT та DOUBLE. Посібник: dev.mysql.com/doc/refman/5.0/uk/numeric-type-overview.html
Markus AO

67

Хоча відповіді вище здаються правильними, лише просте пояснення дасть вам уявлення про те, як це працює.

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

Отже, підсумовуючи, для цього стовпця ви мали б максимальне значення: 999999999.9999


1
найкраща відповідь тут
Julian Silvestri

15

У коментарях є правильні рішення, але узагальнити їх у єдину відповідь:

Ви повинні використовувати DECIMAL (6,4).

Тоді ви можете мати 6 загальної кількості цифр, 2 до і 4 після десяткової точки (шкали). Принаймні відповідно до цього .


6

MySQL 5.x специфікація для десяткового типу даних є: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Відповідь, наведена вище, неправильна, кажучи, що непідписані десяткові знаки неможливі.

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

Ви також можете створити неподписані (тобто не негативні) типи даних FLOAT та DOUBLE.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.