MySQL: размер десятичного типа данных

У меня есть несколько значений, поступающих с сервера, которые необходимо сохранить в моей базе данных. Я не эксперт по MySQL, но я понимаю это достаточно хорошо для базового ввода / вывода. Сейчас я пытаюсь выяснить, какую длину я должен использовать при сохранении следующих десятичных знаков.

tax_rate [DECIMAL ?,?]: value(0.014840000000)
units [DECIMAL ?,?]: value(1.00)
initial_charge [DECIMAL ?,?]: value(2.5110)
charge [DECIMAL ?,?]: value(2.8967)
link_tax [DECIMAL ?,?]: value(0.385652)
exempt [DECIMAL ?,?]: value(0.0000)
tax [DECIMAL ?,?]: value(0.042986)
base_price [DECIMAL ?,?]: value(41.8500)

Я надеюсь, что кто-то может предложить правильную длину данных, которую мне нужно использовать для этих значений, КАК ХОРОШО объяснить, почему они выбрали эти значения. Или, может быть, ссылка на статью, которая подробно объясняет десятичные числа MySQL.

Любая помощь будет оценена.

Спасибо!

-------Редактировать--------

После прочтения документации по mysql я решил следующие длины десятичных чисел:

tax_rate [DECIMAL 15,12]: value(0.014840000000) ? max(999.999999999999)
units [DECIMAL 6,2]: value(1.00) ? max(9999.99)
initial_charge [DECIMAL 9,4]: value(2.5110) ? max(99999.9999)
charge [DECIMAL 9,4]: value(2.8967) ? max(99999.9999)
link_tax [DECIMAL 9,6]: value(0.385652) ? max(999.999999)
exempt [DECIMAL 9,4]: value(0.0000) ? max(9999.9999)
tax [DECIMAL 10,6]: value(0.042986) ? max(999999.999999)
base_price [DECIMAL 10,4]: value(41.8500) ? max(999999.9999)

3 ответа

Решение

Из MySQL:

Синтаксис объявления для столбца DECIMAL - DECIMAL(M,D). Диапазоны значений для аргументов в MySQL 5.1 следующие:

М - максимальное количество цифр (точность). Диапазон значений от 1 до 65. (В более старых версиях MySQL диапазон допускался от 1 до 254.)

D - количество цифр справа от десятичной точки (шкала). Он имеет диапазон от 0 до 30 и должен быть не больше чем M.

Считайте это число: 123456789.12345 здесь M является 14 а также D является 5 затем, основываясь на этом принципе, вы можете установить DECIMALS(M,D) для каждого столбца на основе их ожидаемых максимальных значений.

В MySQLDECIMAL(M,D)/или эквивалентNUMERIC(M,D)/:

  • Mобщее количество цифр,
  • D– количество цифр дробной части.

Вот пример числа, которое подойдет (по крайней мере)DECIMAL(8,3):

      Integer  Fractional
   part  part (D)
   ┌─┴─┐ ┌┴┐
   58282.349
   └───┬───┘
       M

Прежде чем объяснять детали, вот тизер-ответ для приведенного выше примера:

      3 bytes   2 bytes
   ┌─┴─┐ ┌┴┐
   58282.349

Согласно документации, количество байтов, используемых внутри для целой и дробной частей числа, определяется отдельно. Но метод тот же: для каждой цифры, кратной 9, требуется 4 байта, а для любых оставшихся цифр требуется некоторая часть 4 байтов, как показано в следующей таблице:

Отрицательные числа попадают в те же диапазоны. Например:

  • DECIMAL(3,0)может хранить номера между-999и999.
  • DECIMAL(4,3)может хранить номера между-9.999и9.999.

Поскольку принятый ответ оставил меня в покое, я побежал SHOW CREATE TABLE на таблице, которая содержит несколько столбцов, определенных как DECIMAL DEFAULT NULL (обратите внимание на отсутствие значений для M и D.

Результат следует.

data_warehouse as davidg Wed Dec 05 12:10:36 2018 >SHOW CREATE TABLE erth_calendarmonths_historic_usage_preload;
+--------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table                                      | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
+--------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| erth_calendarmonths_historic_usage_preload | CREATE TABLE `erth_calendarmonths_historic_usage_preload` (
  `market` varchar(100) NOT NULL,
  `commodity` varchar(100) NOT NULL,
  `account_number` varchar(100) NOT NULL,
  `meter_number` varchar(100) NOT NULL,
  `period_year_month` int(11) NOT NULL,
  `estimated_usage_amount` decimal(18,7) DEFAULT NULL,
  `unit` varchar(100) DEFAULT NULL,
  `meter_read_start_date_part_1` datetime DEFAULT NULL,
  `meter_read_end_date_part_1` datetime DEFAULT NULL,
  `gross_nonadjusted_usage_amount_part_1` decimal(10,0) DEFAULT NULL,
  `applied_nonadjusted_usage_amount_part_1` decimal(10,0) DEFAULT NULL,
  `meter_read_start_date_part_2` datetime DEFAULT NULL,
  `meter_read_end_date_part_2` datetime DEFAULT NULL,
  `gross_nonadjusted_usage_amount_part_2` decimal(10,0) DEFAULT NULL,
  `applied_nonadjusted_usage_amount_part_2` decimal(10,0) DEFAULT NULL,
  `utility_rate_class` varchar(100) DEFAULT NULL,
  `utility_rate_subclass` varchar(100) DEFAULT NULL,
  `load_profile` varchar(100) DEFAULT NULL,
  `hu_type` varchar(100) DEFAULT NULL,
  `type` varchar(100) DEFAULT NULL,
  `utility_duns` varchar(100) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  `update_date` datetime DEFAULT NULL,
  `UsedBuckets` tinyint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`market`,`commodity`,`account_number`,`meter_number`,`period_year_month`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Вышеизложенное делает значения по умолчанию M и D самоочевидными; М = 10, а Д = 0. Излишне говорить, что это почти наверняка не желаемый результат.

Ты всегда должен указывать свои значения M и D.

Другие вопросы по тегам