Подтвердить что ты не робот

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)
4b9b3361

Ответ 1

От MySQL:

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

M - максимальное количество цифр (точность). Он имеет диапазон 1 до 65. (Старые версии MySQL допускают диапазон от 1 до 254.)

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

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

Ответ 2

Поскольку принятый ответ оставил меня желающим, я запустил 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 само собой разумеющимися; M = 10, а D = 0. Излишне говорить, что это почти наверняка не желаемый результат.

Всегда указывайте значения M и D.