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.